我已经关注了this问题,但那里的答案对我不起作用 我不想要为此使用 UDF 并且 map_concat 对我不起作用。 还有其他方法可以组合地图吗?
例如
id | 价值 |
---|---|
1 | 地图(k1 -> v1) |
2 | 地图(k2 -> v2) |
输出应该是
id | 价值 |
---|---|
1 | 地图(k1 -> v1, k2 -> v2) |
这是我的解决方案,我假设我们可以删除 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 -> ...|
+--------------------+