我可以在 pyspark 将地图数据聚合为数组吗?

Can I aggregate map data as array at pyspark?

我正在尝试汇总数据。它在下面工作。

name id day value
ken 01 02-01 good
ken 01 02-02 error
spark_df

spark_df.groupBy("name", "id").\
    agg(func.collect_list(func.create_map(func.col("day"),func.col("value)))).alias("day_val"))

我可以将 day_val 数据汇总为地图的 list。像这样

[{"day1":"value1"},{"day2":"value2"},{"day3":"value3"},....]

但是我想保存为

{"day1":"value1","day2":"value2","day3":"value3"}

因为在 dynamodb 上我想将它用作地图而不是列表。 我可以将其转换为数组或将其聚合为地图吗?

谢谢。

您可以使用 map_from_entries:

import pyspark.sql.functions as F

result = df.groupBy('name', 'id').agg(
    F.map_from_entries(
        F.collect_list(
            F.struct('day', 'value')
        )
    ).alias('day_val')
)

result.show(truncate=False)
+----+---+-------------------------------+
|name|id |day_val                        |
+----+---+-------------------------------+
|ken |1  |[02-01 -> good, 02-02 -> error]|
+----+---+-------------------------------+

map_from_arrays:

from pyspark.sql import functions as F

df1 = df.groupBy('name', 'id').agg(
    F.map_from_arrays(
        F.collect_list('day'),
        F.collect_list('value')
    ).alias('day_val')
)

df1.show(truncate=False)

#+----+---+-------------------------------+
#|name|id |day_val                        |
#+----+---+-------------------------------+
#|ken |01 |[02-01 -> good, 02-02 -> error]|
#+----+---+-------------------------------+