【问题标题】:Join multiple Pyspark dataframes based on same column name基于相同的列名加入多个 Pyspark 数据框
【发布时间】:2021-10-21 13:18:20
【问题描述】:

我是 Pyspark 的新手,所以我坚持以下几点:

我有 5 个数据帧,每个数据帧都有相同的主键,称为关注代码。 我需要将所有这些数据帧外部连接在一起,并且需要从 4 个数据帧中删除名为关注代码的 4 列。

例如: Dataframe Df1 外连接 Df2 基于关注代码 Dataframe Df1 外连接 Df3 基于关注代码 等等..

我当前的 Pyspark 语法如下所示:

df1.join(df2,["concern_code"])\
  .join(df3,df1["concern_code"] == df3["concern_code"])\
  .join(df4,df1["concern_code"] == df4["concern_code"])\
  .join(df5,df1["concern_code"] == df5["concern_code"])\
   .show()

我需要如何修正语法以执行外连接并拥有一个新数据框的最终版本,它只有一个关注代码列?

【问题讨论】:

    标签: python dataframe pyspark


    【解决方案1】:

    你很接近。 假设您有以下 dfs:

    d = [
        ("a", 5.2),
        ("b", 10.4),
        ("c", 7.8),
        ("d", 11.2),
        
    ]
    df1 = spark.createDataFrame(d, ['concern_code','value'])
    
    df2 = spark.createDataFrame(d, ['concern_code','value1'])
    
    df3 = spark.createDataFrame(d, ['concern_code','value2'])
    
    df4 = spark.createDataFrame(d, ['concern_code','value3'])
    
    df5 = spark.createDataFrame(d, ['concern_code','value4'])
    
    df1.show()
    
    # output
    +------------+-----+
    |concern_code|value|
    +------------+-----+
    |           a|  5.2|
    |           b| 10.4|
    |           c|  7.8|
    |           d| 11.2|
    +------------+-----+
    
    
    
    
    (
        df1
        .join(df2,on="concern_code", how="outer")
        .join(df3,on="concern_code", how="outer")
        .join(df4,on="concern_code", how="outer")
        .join(df5,on="concern_code", how="outer")
       .show()
    )
    
    # output
    +------------+-----+------+------+------+------+
    |concern_code|value|value1|value2|value3|value4|
    +------------+-----+------+------+------+------+
    |           c|  7.8|   7.8|   7.8|   7.8|   7.8|
    |           d| 11.2|  11.2|  11.2|  11.2|  11.2|
    |           a|  5.2|   5.2|   5.2|   5.2|   5.2|
    |           b| 10.4|  10.4|  10.4|  10.4|  10.4|
    +------------+-----+------+------+------+------+
    

    【讨论】:

    • 当其他 4 个数据框与第一个数据框有不同的列时,您的建议是否有效?
    • 当然,除了键(这里键是关注代码)之外的所有列都将作为列添加到最终连接的数据框中。
    【解决方案2】:

    如果您在列上连接两个数据框,则列将被复制,就像您的情况一样。所以我建议使用一个字符串数组,或者只是一个字符串,即'id',来连接两个或多个数据帧。

    下面的代码不应重复列名:

    df1.join(df2,on='id', how='outer')\
       .join(df3,on='id', how='outer')\
       .join(df4,on='id', how='outer')\
       .join(df5,on='id'  how='outer')\
       .show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2020-09-26
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多