2016-08-03 61 views
1

我有兩個數據幀讓我們說A和B.它們有不同的模式。有效地加入並且沒有將數據幀的數據與其他數據幀相結合

我想從數據框A中獲取記錄,該數據框A與鍵B上的連接以及未加入的記錄相同,我也想要這些記錄。

這可以在一個查詢中完成嗎? 由於兩次檢查相同的數據會降低性能。 DataFrame A的尺寸比B大得多。 Dataframe B的尺寸大約爲50Gb-100gb。 因此,我不能在這種情況下廣播B.

我可以得到一個Dataframe C作爲結果,它可以有一個分區列「加入」值爲「是」或「否」,表示A中的數據是否加入或不加入B.

如果A有重複的情況會怎樣?我不想要他們。 我在想,我會稍後在C數據框上做一個recudeByKey。有關於此的任何建議?

我正在使用配置單元表在HDFS上以ORC文件格式存儲數據。 以scala編寫代碼。

+0

我想僅從上的一個鍵,並記錄與B加入組播數據幀A記錄刪除列沒有加入,我也想要這些(這些是Dataframe A本身的記錄)。 我只想要來自A而不是B的行。我想從A加入B的行,以及那些沒有加入B的行,如果他們確實匹配或不與B一起標記。 – grv

回答

4

是的,你只需要做一個左外連接:

import sqlContext.implicits._ 

val A = sc.parallelize(List(("id1", 1234),("id1", 1234),("id3", 5678))).toDF("id1", "number") 
val B = sc.parallelize(List(("id1", "Hello"),("id2", "world"))).toDF("id2", "text") 

val joined = udf((id: String) => id match { 
    case null => "No" 
    case _ => "Yes" 
}) 

val C = A 
    .distinct 
    .join(B, 'id1 === 'id2, "left_outer") 
    .withColumn("joined",joined('id2)) 
    .drop('id2) 
    .drop('text) 

這將產生一個數據幀C:[id1: string, number: int, joined: string],看起來像這樣:

[id1,1234,Yes] 
[id3,5678,No] 

注意,我添加了一個distinct到篩選出A中的重複項,並指出C中最後一列指的是否加入。

編輯:繼從OP的話,我已經加入了drop線從B.

+0

我不需要列中的列B.我感興趣的模式是 A的模式,「加入」就是這樣。 – grv

+0

@grv如果我的答案是你正在尋找的,那麼你可以將它標記爲已接受的答案?否則,請澄清您在答案中遇到的任何問題。 –

+0

我需要一個更多的幫助。 如果我想要表A中不在表B中的記錄基於某個鍵,該怎麼辦? 其他看待它的方法是在一個鍵上的除了子句而不是整個記錄。 – grv

相關問題