我使用Pyspark,我有4个数据帧,每个数据帧都有相同的模式。我想数一下它们中不同的id。
但如果我这样做:
combined_df1 = (df1.select('id'))
.union(df2.select('id'))
.union(df3.select('id'))
.union(df4.select('id'))
combined_df1.select('id').distinct().count()
我得到的数字比我得到的要高:
combined_df2 = df1
.union(df2)
.union(df3)
.union(df4)
combined_df2.select('id').distinct().count()
返回的行增加了约10%,这不是一个微不足道的数字。这是怎么回事?
为什么在并集之前还是之后选择不同的id
很重要?不管怎样,它都是id
的相同列表,不是吗?
很难确定,但我的猜测是,每个数据帧中的列/模式的顺序不同。CCD_ 3将您的数据帧合并为一个大数据帧;统一的";以及下一个数据帧的另一列。因此;失败";因为它试图对不适当的值进行重复数据消除。
解决方案是用unionByName
代替union
。
准确回答您的问题:
为什么在并集之前或之后选择不同的id很重要?
TL;DR==>联合不会区分价值观。
让我们举一个简单的例子,有两个数据帧:
df1:
id |
---|
2 |
2 |
3 |