【问题标题】:Join two dataframes in pyspark by one column通过一列连接 pyspark 中的两个数据框
【发布时间】:2018-03-08 01:34:31
【问题描述】:

如果该 id 包含在第二个数据帧的同一列中,我需要将两个数据帧连接一列并从第一个数据帧中取出行:

df1:

  id    a     b
  2     1     1
  3    0.5    1
  4     1     2
  5     2     1

df2:

 id      c    d
  2      fs   a
  5      fa   f

期望的输出:

df:
  id   a   b
   2   1   1
   5   2   1

我尝试过使用 df1.join(df2("id"),"left"),但给我错误:'Dataframe' object is not callable。

【问题讨论】:

    标签: apache-spark join pyspark


    【解决方案1】:

    df2("id") 不是用于选择列的有效 Python 语法,您需要 df2[["id"]] 或使用 select df2.select("id");对于您的示例,您可以这样做:

    df1.join(df2.select("id"), "id").show()
    
    +---+---+---+
    | id|  a|  b|
    +---+---+---+
    |  5|2.0|  1|
    |  2|1.0|  1|
    +---+---+---+
    

    或:

    df1.join(df2[["id"]], "id").show()
    +---+---+---+
    | id|  a|  b|
    +---+---+---+
    |  5|2.0|  1|
    |  2|1.0|  1|
    +---+---+---+
    

    【讨论】:

    • 对不起,我复制了我的语法,但在这里制作了另一个数据框。 Imsi 是和 ID
    【解决方案2】:

    如果您需要检查id 是否存在于df2 中并且不需要df2 的输出中的任何列,那么isin() 是更有效的解决方案(这类似于SQL 中的EXISTSIN )。

    df1 = spark.createDataFrame([(2,1,1) ,(3,5,1,),(4,1,2),(5,2,1)], "id: Int, a : Int , b : Int")
    
    df2 = spark.createDataFrame([(2,'fs','a') ,(5,'fa','f')], ['id','c','d'])
    

    创建 df2.id 作为列表并将其传递给 isin() 下的 df1

    from pyspark.sql.functions import col
    
    df2_list = df2.select('id').rdd.map(lambda row : row[0]).collect()
    
    df1.where(col('id').isin(df2_list)).show()
    
    #+---+---+---+
    #| id|  a|  b|
    #+---+---+---+
    #|  2|  1|  1|
    #|  5|  2|  1|
    #+---+---+---+
    

    推荐使用isin()IF -

    • 您不需要从参考数据帧/表中返回数据

    • 您在参考数据框/表中有重复项(如果重复值,JOIN 可能会导致重复行)

    • 您只想检查特定值的存在

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多