Pyspark - 按组变量折叠数据框中的所有列

Pyspark - collapse all columns in dataframe by group variable

我有一个如下所示的数据集。

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 像这里 这样的功能,但是,它一直很不成功。

可以使用dtypes分类,分别按stringdate类型列分组,聚合数值列。

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)