当前位置:   article > 正文

哪些情况下左联接的数据量比左表大?

哪些情况下左联接的数据量比左表大?




1、背景概述


本文主要探讨SQL和Pandas左连接数据量比左表大的问题。在某些情况下,执行左连接时,SQL和Pandas输出的结果会比左表数据量大。这是为什么呢?

左连接是关系型数据库中最常见的连接之一。它的作用是从左表中取出所有的行,以及与右表匹配的所有行。如果某个行在右表中没有匹配到,则会在输出结果中以NULL的形式呈现

2、问题描述


下面我们分别以Pandas和SQL为例演示这种情况

1)Pandas左连接

下面我们准备两个DataFrame,然后通过Pandas的merge函数来执行左连接

数据准备:

df1 = pd.DataFrame({'k': ['A', 'B', 'C'], 'v': [1, 2, 3]})
df2 = pd.DataFrame({'k': ['B', 'C', 'C', 'D'], 'n': [4, 5, 6, 7]})
print(df1.to_string())
'''
   k  v
0  A  1
1  B  2
2  C  3
'''
print(df2.to_string())
'''
   k  n
0  B  4
1  C  5
2  C  6
3  D  7
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

使用Pandas左连接:

df = pd.merge(df1, df2, on='k', how='left')
print(df.to_string())
'''
   k  v    n
0  A  1  NaN
1  B  2  4.0
2  C  3  5.0
3  C  3  6.0
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2)SQL左连接

下面我们准备两个表,然后分别使用Presto、Hive和Spark对两表进行左连接关联

数据准备:

create table t1(
    k string,
    v bigint
)
insert into t1 values 
('A', 1),
('B', 2),
('C', 3)

create table t2(
    k string,
    n bigint
)
insert into t2 values 
('B', 4),
('C', 5),
('C', 6),
('D', 7)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

分别使用Presto、Hive和Spark左连接:

select * from t1 left join t2 on t1.k=t2.k
+---+---+-----+-----+
|  k|  v|   k0|    n|
+---+---+-----+-----+
|  A|  1| NULL| NULL|
|  B|  2|    B|    4|
|  C|  3|    C|    5|
|  C|  3|    C|    6|
+---+---+-----+-----+
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

除了Presto不会对结果排序外,Presto、Hive和Spark左连接执行的结果是一致的

也就是说,无论是Pandas,还是SQL,在某些情况下,左连接的数据量都有可能比左表大

3、问题原因


从数据和结果看,我们不难发现,问题的原因是表中存在重复的关联键值。在这种情况下,SQL和Pandas左连接将左表与右表所有可能的方式进行组合,从而导致输出结果比左表大

4、问题总结


通过这个问题,我们总结一下左联接的数据量比左表大的一些情况:

  • 1) 左表与右表为一对多或多对多
  • 2) 左表与右表关联键都存在空值NULL

针对以上情况,我们一般有以下解决方案:

  • 1) 视情景删除或聚合右表中重复关联键的数据
  • 2) 过滤表中关联键值为NULL的行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/503252
推荐阅读
相关标签
  

闽ICP备14008679号