为什么在合并 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)

您看到之后执行不同会删除数据帧之间存在的重复项。