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

本文探讨了在SQL和Pandas左连接中,当右表与左表存在一对多或多对多关系且关联键有重复或NULL值时,可能导致左连接结果数据量大于左表的现象,并提供了相应的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




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
'''

使用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
'''

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)

分别使用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|
+---+---+-----+-----+

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

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

3、问题原因


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

4、问题总结


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

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值