带有循环Pyspark的Concat多列

时间:2018-01-17 09:30:11

标签: python python-2.7 pyspark

我有n个字符串列数组。我想用一个循环将这n列连接起来。

我有这个功能来连接列:

def concat(type):
    def concat_(*args):
        return list(chain(*args))
    return udf(concat_, ArrayType(type))

concat_string_arrays = concat(StringType())

在下面的例子中,我有4列,我将这样连接:

df_aux = df.select('ID_col',concat_string_arrays(col("patron_txt_1"),col("patron_txt_2"),col('patron_txt_3'),col('patron_txt_0')).alias('patron_txt')

但是,如果我有200列,我怎么能用循环动态地使用这个函数?

1 个答案:

答案 0 :(得分:0)

您可以使用from itertools import chain from pyspark.sql.functions import col, udf from pyspark.sql.types import * df = sqlContext.createDataFrame([("1", "2","3","4"), ("5","6","7","8")], ('ID_col', 'patron_txt_0','patron_txt_1','patron_txt_2')) def concat(type): def concat_(*args): return list(chain(*args)) return udf(concat_, ArrayType(type)) concat_string_arrays = concat(StringType()) #Select the columns you want to concatenate cols = [c for c in df.columns if c.startswith("patron_txt")] #Use the * operator to pass multiple columns to concat_string_arrays df.select('ID_col',concat_string_arrays(*cols).alias('patron_txt')).show() 运算符将列列表传递给concat UDF:

+------+----------+
|ID_col|patron_txt|
+------+----------+
|     1| [2, 3, 4]|
|     5| [6, 7, 8]|
+------+----------+

这导致以下输出:

{{1}}