PySpark中如何通过循环动态拼接多个字符串数组列?
动态拼接大量数组列的实现方法
刚好碰到过类似的场景,其实核心思路就是动态生成需要拼接的列对象列表,再用解包的方式传给你的UDF,完全不用手动写200个col()调用。具体步骤如下:
首先,你需要先把所有要拼接的列名整理出来——如果你的列名是有规律的(比如从patron_txt_0到patron_txt_199),直接用列表推导式生成就行:
# 生成200个列名:patron_txt_0 到 patron_txt_199 cols_to_concat = [f"patron_txt_{i}" for i in range(200)]
要是列名没有严格的数字序列,但有统一前缀(比如都包含patron_txt_),也可以从DataFrame的列名里筛选:
# 筛选所有包含指定前缀的列 cols_to_concat = [col_name for col_name in df.columns if "patron_txt_" in col_name]
接下来,把这些列名转换成Spark的col对象列表:
from pyspark.sql.functions import col col_list = [col(c) for c in cols_to_concat]
最后一步就很简单了,用*操作符把这个列表解包,直接传给你已经定义好的concat_string_arrays函数就行,和你手动写4列的逻辑完全一致:
df_aux = df.select('ID_col', concat_string_arrays(*col_list).alias('patron_txt'))
这样不管你是200列还是更多,只要列名能正确识别,就能自动完成拼接,再也不用一个个手动写列名啦。
内容的提问来源于stack exchange,提问作者Carmen Pérez Carrillo
相关产品推荐
相关产品推荐

