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

mrwjdhj3  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(456)

我正在收集数据。它在下面工作。
nameiddayvalueken0102-01goodken0102-02错误

spark_df

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

我可以将日值数据聚合为Map列表。这样地

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

但我想把它保存为

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

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

31moq8wy

31moq8wy1#

或者 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]|

# +----+---+-------------------------------+
vbkedwbf

vbkedwbf2#

你可以用 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]|
+----+---+-------------------------------+

相关问题