我正在使用 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在并集之前或之后選擇 distinct 很重要?id無論哪種方式,它都是相同的s串列,不是嗎?
uj5u.com熱心網友回復:
很難確定,但我的猜測是每個資料框中的列/模式的順序不同。union將您的資料幀合并到一個大資料幀中,其中第一個資料幀的 ID 列與下一個資料幀的另一列“聯合”。因此,disctint“失敗”,因為它試圖洗掉不適當的值。
解決方法是union用unionByName.
要準確回答您的問題:
為什么我在聯合之前或之后選擇不同的 id 很重要?
TL;DR ==> Union 不區分值。
讓我們舉一個簡單的例子,有 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)
您會看到,之后執行不同的操作會洗掉資料幀之間存在的重復項。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/363981.html
