如何将Spark DataFrame所有行数据合并为单行单列并保持顺序?
实现方法
可以分两步严格按照要求完成数据合并,保证顺序完全符合预期:
步骤1:拼接每行的列值
先把每行的所有列按原始定义顺序拼接成单个字符串,用concat_ws函数指定空格作为分隔符:
from pyspark.sql import functions as F # 按列顺序拼接每行的所有值 row_concat_df = df.select(F.concat_ws(" ", *df.columns).alias("row_str")) row_concat_df.show()
这一步会得到每行的拼接结果:
+-------+ |row_str| +-------+ | 1 foo| | 2 bar| +-------+
步骤2:合并所有行的字符串为整体
用collect_list收集所有行的拼接字符串(会严格保留原始行顺序),再用concat_ws把列表元素用空格连接,最终生成目标DataFrame:
# 收集所有行字符串并合并成单个结果 new_df = row_concat_df.agg(F.concat_ws(" ", F.collect_list("row_str")).alias("new_column")) new_df.show()
执行后得到的结果完全符合需求:
+-------------+ | new_column| +-------------+ |1 foo 2 bar| +-------------+
完整整合代码
把两步逻辑整合后的完整代码:
from pyspark.sql import SparkSession from pyspark.sql import functions as F spark = SparkSession.builder.appName("concat_all_values").getOrCreate() # 原始DataFrame df = spark.createDataFrame( [ (1, "foo"), (2, "bar"), ], ["id", "label"] ) # 合并逻辑实现 new_df = df.select(F.concat_ws(" ", *df.columns).alias("row_str")) \ .agg(F.concat_ws(" ", F.collect_list("row_str")).alias("new_column")) new_df.show()
内容的提问来源于stack exchange,提问作者Mrmoleje
相关产品推荐
相关产品推荐

