【问题标题】:Concat multiple columns of a dataframe using pyspark使用 pyspark 连接数据框的多列
【发布时间】:2019-02-28 08:32:09
【问题描述】:

假设我有一个列列表,例如:

col_list = ['col1','col2']
df = spark.read.json(path_to_file)
print(df.columns)
# ['col1','col2','col3']

我需要通过连接col1 和col2 创建一个新列。我不想在连接时对列名进行硬编码,但需要从列表中选择它。

我该怎么做?

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您可以使用pyspark.sql.functions.concat() 到concatenate 在list 中指定的任意数量的列。继续将它们作为参数传递。

    from pyspark.sql.functions import concat
    # Creating an example DataFrame
    values = [('A1',11,'A3','A4'),('B1',22,'B3','B4'),('C1',33,'C3','C4')]
    df = sqlContext.createDataFrame(values,['col1','col2','col3','col4'])
    df.show()
    +----+----+----+----+
    |col1|col2|col3|col4|
    +----+----+----+----+
    |  A1|  11|  A3|  A4|
    |  B1|  22|  B3|  B4|
    |  C1|  33|  C3|  C4|
    +----+----+----+----+
    

    在concat() 函数中,您传递需要连接的所有列 - 例如concat('col1','col2')。如果你有一个列表,你可以使用*un-list 它。所以(*['col1','col2']) 返回('col1','col2')

    col_list = ['col1','col2']
    df = df.withColumn('concatenated_cols',concat(*col_list))
    df.show()
    +----+----+----+----+-----------------+
    |col1|col2|col3|col4|concatenated_cols|
    +----+----+----+----+-----------------+
    |  A1|  11|  A3|  A4|             A111|
    |  B1|  22|  B3|  B4|             B122|
    |  C1|  33|  C3|  C4|             C133|
    +----+----+----+----+-----------------+
    

    【讨论】:

    • 我们可以在中间加一个分隔符
    • @GvSridhar 你可以使用这样的东西 concat(col("a"), lit(" "), col("b")) 并且在 lit() 你可以把你的分隔符
    • 如果你想要一个分隔符,使用concat_ws,像这样(*是分隔符):df = df.withColumn('concatenated_cols',concat_ws('*',*col_list))
    • 当我使用 concat_ws(",", *col_list) 时,它返回 "_1" 作为 col 标题而不是 "c​​oncatenated_cols" 并且值变为 Row(concatenated_cols='A1,11,A3,A4 ) .. 我该如何解决这个问题?
    猜你喜欢
    • 2021-09-25
    • 1970-01-01
    • 2020-03-14
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多