在Apache中Saprk檢查比較兩個數據幀我有adataframe用以下結構從歷史使用Scala的
EmployeeDF
id name date code
1 John 2015-4-14 C11
2 Roy 2011-5-20 C11
3 John 2010-5-20 C11
4 John 2012-5-20 C10
不,我要檢查的歷史,如果相同的代碼是適用於同一員工兩年前。我怎樣才能做到這一點。這只是樣本數據,我在數據框中擁有數百萬的數據,並且我想實現性能。加入數據框會降低性能,因爲行是重複的,所以我使用笛卡爾並在自加入過程中複製行。我想用地圖等東西來實現。
編輯:當前的代碼
在第一步中,我得到那些誰重複超過一次,因爲我們正在檢查的歷史,如果有的員工只存在員工(從OP的留言中加入。)一旦這意味着這個員工沒有歷史。因此,對於這一步的代碼是:
val uniqueEmpDF = SparkConfig
.sc
.sqlContext
.sql("SELECT *, '1' as level FROM cpeFirstStep WHERE e_id IN(SELECT e_id FROM cpeFirstStep where code = 'C11' " + " GROUP BY e_id HAVING COUNT(e_id)=1)")
.cache()
第二步是讓誰被重複,而代碼是這樣的員工:
val repeatedEmpDF = SparkConfig
.sc
.sqlContext
.sql("SELECT *, '2' as level FROM cpeFirstStep WHERE e_id IN(SELECT e_id FROM cpeFirstStep where code = 'C11' " + " GROUP BY e_id HAVING COUNT(e_id)>1)")
.cache()
現在主要步驟如下:
val historyJoin = SparkConfig
.sc
.sql("SELECT x.*, CASE WHEN y.code = x.code THEN '3' ELSE '4' END level FROM repeatedEmptDF X " + "LEFT JOIN repeatedEmptDF Y ON y.e_id = x.e_id AND y.code = x.code " + "AND y.date < x.data - INTERVAL 2 YEAR")
2年前? 2年前的含義是什麼?你可以在''code「和」id「'上分組,然後檢查日期條件。 –
請提供您所寫的代碼。它會讓我們更容易幫助你。 –
@ Sarvesh Kumar Singh我想檢查每位員工的歷史,如果兩年或多年前同一員工適用同一代碼,則將此行標記爲1級,並在其他所有情況下將此行標記爲2級。 –