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
分类,分别按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)
我有一个如下所示的数据集。
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
分类,分别按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)