我有一個 PySpark df
:
Store_ID | 類別 | ID | 銷售量 |
---|---|---|---|
1 | 一個 | 123 | 23 |
2 | 一個 | 123 | 45 |
1 | 一個 | 234 | 67 |
1 | 乙 | 567 | 78 |
2 | 乙 | 567 | 34 |
3 | D | 789 | 12 |
1 | 一個 | 890 | 12 |
預期的:
Store_ID | 援助 | 出價 | C_ID | 做過 | 銷售_A | 銷售_B | 銷售_C | 銷售_D |
---|---|---|---|---|---|---|---|---|
1 | 3 | 1 | 0 | 0 | 102 | 78 | 0 | 0 |
2 | 1 | 1 | 0 | 0 | 45 | 34 | 0 | 0 |
3 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 12 |
我可以使用 SQL 以這種方式進行轉換(創建了一個臨時視圖):
SELECT Store_Id,
SUM(IF(Category='A',Sales,0)) AS Sales_A,
SUM(IF(Category='B',Sales,0)) AS Sales_B,
SUM(IF(Category='C',Sales,0)) AS Sales_C,
SUM(IF(Category='D',Sales,0)) AS Sales_D,
COUNT(DISTINCT NULLIF(IF(Category='A',ID,0),0)) AS A_ID,
COUNT(DISTINCT NULLIF(IF(Category='B',ID,0),0)) AS B_ID,
COUNT(DISTINCT NULLIF(IF(Category='C',ID,0),0)) AS C_ID,
COUNT(DISTINCT NULLIF(IF(Category='D',ID,0),0)) AS D_ID
FROM df
GROUP BY Store_Id;
我們如何在 PySpark 中使用本機函式實作相同的功能,因為它更快?
uj5u.com熱心網友回復:
此操作稱為旋轉。
- 幾個聚合,因為你需要兩者,ID計數和銷售額總和
alias
用于聚合,用于更改列名- 在資料透視表中提供值,適用于您需要 C 類數字但 C 不存在的情況。提供值也可以提高性能。
輸入:
from pyspark.sql import functions as F
df = spark.createDataFrame(
[(1, 'A', 123, 23),
(2, 'A', 123, 45),
(1, 'A', 234, 67),
(1, 'B', 567, 78),
(2, 'B', 567, 34),
(3, 'D', 789, 12),
(1, 'A', 890, 12)],
['Store_ID', 'Category', 'ID', 'Sales'])
腳本:
df = (df
.groupBy('Store_ID')
.pivot('Category', ['A', 'B', 'C', 'D'])
.agg(
F.countDistinct('ID').alias('ID'),
F.sum('Sales').alias('Sales'))
.fillna(0))
df.show()
# -------- ---- ------- ---- ------- ---- ------- ---- -------
# |Store_ID|A_ID|A_Sales|B_ID|B_Sales|C_ID|C_Sales|D_ID|D_Sales|
# -------- ---- ------- ---- ------- ---- ------- ---- -------
# | 1| 3| 102| 1| 78| 0| 0| 0| 0|
# | 3| 0| 0| 0| 0| 0| 0| 1| 12|
# | 2| 1| 45| 1| 34| 0| 0| 0| 0|
# -------- ---- ------- ---- ------- ---- ------- ---- -------
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/497515.html
標籤:阿帕奇火花 pyspark 枢 多列 pyspark-pandas