将列(变量)列表连接到一个新的列数据帧pyspark

时间:2020-07-06 20:50:01

标签: python dataframe apache-spark pyspark

我正在使用pyspark,并且有一个数据框df_001,其中包含N列“ rec”,“ id”和“ NAME”。

如果我想添加新列'unq_id',例如,它将连接'rec'和'id'。 当我这样做时,它会完美运行:

df_f_final = df_001.withColumn('unq_id', sf.concat(sf.col('rec'), sf.lit('||'), sf.col('id'))) .

但是我需要创建列列表以连接动态(例如列表): 我怎样才能做到这一点 ? 例如,创建列表:LL = ['rec','id','NAME']或LL = ['rec','NAME']并使用该列表生成数据帧df_f_final并连接列表LL中的列

我认为这很容易,但是这让我发疯了

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

检查一下,让我知道是否有帮助。

    #InputDF
    # +------+------+
    # |rec_id|  name|
    # +------+------+
    # |    a1| ricky|
    # |    b1|sachin|
    # +------+------+

    LL = ['rec_id', 'name']


    df1 = df.withColumn("unq_id_value", F.concat( *[F.concat(F.col(col),F.lit("||")) for col in LL]))

    df2 = df1.withColumn("unq_id_value",F.expr("substring(unq_id_value, 1, length(unq_id_value)-2)"))

    df2.show()

    # +------+------+------------+
    # |rec_id|  name|unq_id_value|
    # +------+------+------------+
    # |    a1| ricky|   a1||ricky|
    # |    b1|sachin|  b1||sachin|
    # +------+------+------------+

答案 1 :(得分:0)

谢谢Loka的回答 终于我找到了一个解决方案,它类似于您的解决方案。 我做到了,它正在起作用

cols = ['col1', lit('||'), 'col2', lit('||'), 'col3']
unq_id = sf.udf(lambda cols: "".join([x for x in cols]), StringType())
df.withColumn('unqid', unq_id(sf.array(cols))).show()