我可以在 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]|
+----+---+-------------------------------+
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]|
#+----+---+-------------------------------+
我正在尝试汇总数据。它在下面工作。
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]|
+----+---+-------------------------------+
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]|
#+----+---+-------------------------------+