赞
踩
本文主要探讨SQL和Pandas左连接数据量比左表大的问题。在某些情况下,执行左连接时,SQL和Pandas输出的结果会比左表数据量大。这是为什么呢?
左连接是关系型数据库中最常见的连接之一。它的作用是从左表中取出所有的行,以及与右表匹配的所有行。如果某个行在右表中没有匹配到,则会在输出结果中以NULL的形式呈现
下面我们分别以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,在某些情况下,左连接的数据量都有可能比左表大
从数据和结果看,我们不难发现,问题的原因是表中存在重复的关联键值。在这种情况下,SQL和Pandas左连接将左表与右表所有可能的方式进行组合,从而导致输出结果比左表大
通过这个问题,我们总结一下左联接的数据量比左表大的一些情况:
针对以上情况,我们一般有以下解决方案:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。