如何将 pyspark 中每列的映射数组合并到单个映射中

问题描述 投票:0回答:1

我已经关注了this问题,但那里的答案对我不起作用 我不想要为此使用 UDF 并且 map_concat 对我不起作用。 还有其他方法可以组合地图吗?

例如

id 价值
1 地图(k1 -> v1)
2 地图(k2 -> v2)

输出应该是

id 价值
1 地图(k1 -> v1, k2 -> v2)
python pyspark databricks
1个回答
0
投票

这是我的解决方案,我假设我们可以删除 id

from pyspark.sql import functions as f
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('test').getOrCreate()

data = [{'id':1, 'map':{'k1': 'v1'}}, {'id':2, 'map':{'k2': 'v2'}}, {'id':3, 'map':{'k3': 'v3'}}]
df = spark.createDataFrame(data)

# removing id , adding grouping column
d_df = df.drop('id').withColumn('group_id', f.lit(1)) 

# aggregating into array of maps
g_df = d_df.groupBy('group_id')\
    .agg(f.collect_list('map').alias('maps'))

# concating the maps
final_df = g_df.select(f.aggregate('maps', f.create_map().cast("map<string,string>"), lambda acc, i: f.map_concat(acc, i)).alias('map_of_maps'))
final_df.show()

结果:

+--------------------+
|         map_of_maps|
+--------------------+
|{k1 -> v1, k2 -> ...|
+--------------------+
© www.soinside.com 2019 - 2024. All rights reserved.