PySpark DataFrame groupBy后将分组内所有行转为数组列的实现问题
报错原因
你调用的map_from_arrays()函数设计上仅接收2个参数:第一个参数为Map结构的键名数组,第二个参数为对应的值数组,你传入了4个参数不符合函数定义,因此触发类型错误。
正确实现方案
你需要先将每行数据转换为统一的结构(Map或Struct),再通过collect_list将同一分组内的结构聚合为数组即可,提供两种常用实现方式:
方式1:生成Map类型数组
如果需要数组内元素为键值对格式的Map类型,用create_map构造每行结构:
from pyspark.sql import functions as F samples_to_map_df = samples.groupBy("url", "source") \ .agg( F.collect_list( F.create_map( F.lit("url"), F.col("url"), F.lit("source"), F.col("source"), F.lit("value"), F.col("value"), F.lit("name"), F.col("name") ) ).alias("data") )
方式2:生成Struct类型数组(更推荐)
如果后续需要直接访问数组内元素的字段,用Struct类型性能更高,写法也更简单,要保留原表所有字段可以直接用struct("*"):
from pyspark.sql import functions as F samples_to_map_df = samples.groupBy("url", "source") \ .agg(F.collect_list(F.struct("*")).alias("data"))
如果需要输出你示例中展示的JSON字符串格式,再加一层to_json转换即可:
samples_to_map_df = samples.groupBy("url", "source") \ .agg(F.to_json(F.collect_list(F.struct("*"))).alias("data"))
内容的提问来源于stack exchange,提问作者Tytire Recubans
相关产品推荐
相关产品推荐

