在pyspark中将两个数据帧加入一列

时间:2017-09-26 18:00:59

标签: apache-spark join pyspark

如果该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'对象不可调用。

2 个答案:

答案 0 :(得分:2)

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

IN

创建df2.id作为列表并将其传递到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']) 下的df1

isin()

建议使用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| #+---+---+---+ IF-

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

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

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

答案 1 :(得分: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|
+---+---+---+