【问题标题】:How to combine multi columns into one in pyspark如何在pyspark中将多列合并为一列
【发布时间】:2021-10-21 09:34:56
【问题描述】:

我有一个包含 2 列 (df1) 的数据框。现在我想将列值合并为一个(df2)。怎么样?

【问题讨论】:

    标签: pyspark multiple-columns


    【解决方案1】:

    假设你有这样的 DataFrame:

    d = [
        ("Value 1", 1),
        ("Value 2", 2),
        ("Value 3", 3),
        ("Value 4", 4),
        ("Value 5", 5),
        
    ]
    df = spark.createDataFrame(d,['col1','col2'])
    df.show()
    
    # output
    +-------+----+
    |   col1|col2|
    +-------+----+
    |Value 1|   1|
    |Value 2|   2|
    |Value 3|   3|
    |Value 4|   4|
    |Value 5|   5|
    +-------+----+
    
    

    您可以使用以下语法连接列并根据需要设置它们的格式:

    (
        df.withColumn("newCol", 
                      F.format_string("Col 1: %s Col 2: %s", df.col1, df.col2))
        .show(truncate=False)
    )
    
    # output
    +-------+----+-----------------------+
    |col1   |col2|newCol                 |
    +-------+----+-----------------------+
    |Value 1|1   |Col 1: Value 1 Col 2: 1|
    |Value 2|2   |Col 1: Value 2 Col 2: 2|
    |Value 3|3   |Col 1: Value 3 Col 2: 3|
    |Value 4|4   |Col 1: Value 4 Col 2: 4|
    |Value 5|5   |Col 1: Value 5 Col 2: 5|
    +-------+----+-----------------------+
    

    【讨论】:

      【解决方案2】:
      from pyspark.sql.functions import concat
      
      df1.withColumn("Merge", concat(df1.Column_1, df1.Column_2)).show()
      

      【讨论】:

        【解决方案3】:

        您可以使用结构或映射。

        结构:

        df.withColumn(
            "price_struct",
            F.struct(
                (F.col("total_price")*100).alias("amount"),
                "total_price_currency",
                F.lit("CENTI").alias("unit")
            )
        )
        

        结果

        +-----------+--------------------+--------------------+
        |total_price|total_price_currency|        price_struct|
        +-----------+--------------------+--------------------+
        |       79.0|                 USD|[7900.0, USD, CENTI]|
        +-----------+--------------------+--------------------+
        

        或作为地图

        df
         .withColumn("price_map",
            F.create_map(
                F.lit("currency"), F.col("total_price_currency"),
                F.lit("amount"), F.col("total_price")*100,
                F.lit("unit"), F.lit("CENTI")
            ).alias("price_struct")
        )
        

        结果

        +-----------+--------------------+--------------------+
        |total_price|total_price_currency|           price_map|
        +-----------+--------------------+--------------------+
        |       79.0|                 USD|[currency -> USD,...|
        +-----------+--------------------+--------------------+
        

        【讨论】:

        • 这就是我需要的。非常感谢!
        猜你喜欢
        • 2021-12-29
        • 2020-06-11
        • 1970-01-01
        • 2016-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-21
        • 1970-01-01
        相关资源
        最近更新 更多