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

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

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

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

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

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

但我想把它保存为

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

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

31moq8wy

31moq8wy1#

或者 map_from_arrays :

  1. from pyspark.sql import functions as F
  2. df1 = df.groupBy('name', 'id').agg(
  3. F.map_from_arrays(
  4. F.collect_list('day'),
  5. F.collect_list('value')
  6. ).alias('day_val')
  7. )
  8. df1.show(truncate=False)
  9. # +----+---+-------------------------------+
  10. # |name|id |day_val |
  11. # +----+---+-------------------------------+
  12. # |ken |01 |[02-01 -> good, 02-02 -> error]|
  13. # +----+---+-------------------------------+
展开查看全部
vbkedwbf

vbkedwbf2#

你可以用 map_from_entries :

  1. import pyspark.sql.functions as F
  2. result = df.groupBy('name', 'id').agg(
  3. F.map_from_entries(
  4. F.collect_list(
  5. F.struct('day', 'value')
  6. )
  7. ).alias('day_val')
  8. )
  9. result.show(truncate=False)
  10. +----+---+-------------------------------+
  11. |name|id |day_val |
  12. +----+---+-------------------------------+
  13. |ken |1 |[02-01 -> good, 02-02 -> error]|
  14. +----+---+-------------------------------+
展开查看全部

相关问题