如何在PySpark中按指定列名列表拼接多列为单列(分号分隔)
正确实现多列拼接方法
问题分析
你之前的两种方法都存在问题:
- 第一种代码里的
custom.({issue})是无效语法,PySpark没有这种用法,完全没必要用map_values绕弯子。 - 第二种用
lit(issue)会把列名集合直接当作字符串常量插入新列,自然只会显示列名而非对应列的实际值。
正确代码实现
要实现指定列的拼接,需要把列名转换成PySpark的Column对象,再传给concat_ws函数:
from pyspark.sql.functions import concat_ws, col # 定义需要拼接的列名集合 issue_cols = {'a', 'b', 'c'} # 拼接指定列的值,用分号分隔 df_issue = df.withColumn('issue', concat_ws(';', *[col(c) for c in issue_cols]))
补充说明
- 如果需要固定拼接顺序,把集合改成列表即可(集合是无序的),比如
issue_cols = ['a', 'b', 'c'],这样会严格按照a、b、c的顺序拼接对应值。 concat_ws会自动忽略null值,如果某列的值为null,拼接时不会插入多余的分号。
内容的提问来源于stack exchange,提问作者Giorgi
相关产品推荐
相关产品推荐

