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