为什么在合并 returns 之前选择 distinct 比之后选择更多的列?
Why does selecting distinct before unioning returns more columns than doing it after?
我正在使用 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%,这不是一个微不足道的数量。这是怎么回事?
为什么我 select distinct id
在联合之前或之后很重要?无论哪种方式,都是相同的 id
列表,不是吗?
很难确定,但我的猜测是每个数据帧中的 columns/schemas 没有相同的顺序。 union
将您的数据框合并到一个大数据框中,其中第一个数据框的 ID 列与下一个数据框的另一列“合并”。因此,disctint“失败”了,因为它试图删除不适当的值。
解决办法是把union
换成unionByName
。
准确回答您的问题:
Why does it matter whether I select distinct id before or after the union?
TL;DR ==> 并集不区分值。
让我们举一个简单的例子,有 2 个数据帧:
df1:
id
2
2
3
df2:
id
1
1
3
id1.distinct ==> [2,3]
id2.distinct ==> [1,3]
id1.distinct().union(id2.distinct) ==> ([2,3]).union([1,3]) ==> [2,3,1,3] (4 elements)
id1.union(id2) ==> [2,2,3,1,1,3]
id1.union(id2).distinct() ==> [1,2,3] (only 3 elements)
您看到之后执行不同会删除数据帧之间存在的重复项。
我正在使用 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%,这不是一个微不足道的数量。这是怎么回事?
为什么我 select distinct id
在联合之前或之后很重要?无论哪种方式,都是相同的 id
列表,不是吗?
很难确定,但我的猜测是每个数据帧中的 columns/schemas 没有相同的顺序。 union
将您的数据框合并到一个大数据框中,其中第一个数据框的 ID 列与下一个数据框的另一列“合并”。因此,disctint“失败”了,因为它试图删除不适当的值。
解决办法是把union
换成unionByName
。
准确回答您的问题:
Why does it matter whether I select distinct id before or after the union?
TL;DR ==> 并集不区分值。
让我们举一个简单的例子,有 2 个数据帧:
df1:
id |
---|
2 |
2 |
3 |
df2:
id |
---|
1 |
1 |
3 |
id1.distinct ==> [2,3]
id2.distinct ==> [1,3]
id1.distinct().union(id2.distinct) ==> ([2,3]).union([1,3]) ==> [2,3,1,3] (4 elements)
id1.union(id2) ==> [2,2,3,1,1,3]
id1.union(id2).distinct() ==> [1,2,3] (only 3 elements)
您看到之后执行不同会删除数据帧之间存在的重复项。