我有一個如下所示的資料集。
df = spark.createDataFrame(
[
("001A", 105, "foo", to_date("2022-01-01", "yyyy-MM-dd")),
("001A", 25, "foo", to_date("2022-01-01", "yyyy-MM-dd")),
("002B", 85, "bar", to_date("2022-02-05", "yyyy-MM-dd")),
("002B", 15, "bar", to_date("2022-02-05", "yyyy-MM-dd")),
],
["id", "num_col1", "str_col1", "date_col1"]
)
df.show()
---- -------- -------- ----------
| id|num_col1|str_col1| date_col1|
---- -------- -------- ----------
|001A| 105| foo|2022-01-01|
|001A| 25| foo|2022-01-01|
|002B| 85| bar|2022-01-15|
|002B| 15| bar|2022-01-15|
---- -------- -------- ----------
我想要實作的是一種聚合形式,df其中我按值分組,id然后在資料框中的所有剩余列中進行聚合。因此生成的資料框看起來像這樣
---- -------- -------- ----------
| id|num_col1|str_col1| date_col1|
---- -------- -------- ----------
|001A| 130| foo|2022-01-01|
|002B| 100| bar|2022-01-15|
---- -------- -------- ----------
資料框包含以下內容的混合:
- 數字列 - 需要求和
- 字串列 - 組之間總是相同的 - 所以只需要采用現有值
- 日期列 - 在組之間也總是相同的 - 所以只需要采用現有值
資料框還包含很多很多列,因此任何涉及寫出每一列的方法都不起作用。
我已經非常全面地查看了整個網路,但沒有找到任何類似的問題或解決方案,我可以對其進行修改以使其適用于我的資料。
我對 PySpark 很陌生,所以我的嘗試是徒勞的,但我嘗試使用該collect_set函式將每一行折疊成組,目的是應用map像這里Merge multiple spark rows to one這樣的函式,但是,它一直相當不成功。
uj5u.com熱心網友回復:
您可以使用分別對列dtypes進行分類、分組string和date型別,以及聚合數字列。
df = df.groupBy(*[t[0] for t in df.dtypes if t[1] in ('string', 'date')]) \
.agg(*[F.sum(t[0]).alias(t[0]) for t in df.dtypes if t[1] not in ('string', 'date')])
df.printSchema()
df.show(truncate=False)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/436861.html
