[英]Join two dataframes in pyspark by one column
我有兩個數據框,我需要按一列進行連接,並且如果該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'對象不可調用。
如果需要檢查df2
是否存在id
,並且df2
的輸出中不需要任何列,則isin()
是更有效的解決方案(與SQL中的EXISTS
和IN
相似)。
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 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可能導致重復行)
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|
+---+---+---+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.