2016-07-07 46 views
1

我有兩個dataframes:斯卡拉星火 - Map函數引用另一個數據框

DF1:

+---+------+----+ 
| id|weight|time| 
+---+------+----+ 
| A| 0.1| 1| 
| A| 0.2| 2| 
| A| 0.3| 4| 
| A| 0.4| 5| 
| B| 0.5| 1| 
| B| 0.7| 3| 
| B| 0.8| 6| 
| B| 0.9| 7| 
| B| 1.0| 8| 
+---+------+----+ 

DF2:

+---+---+-------+-----+ 
| id| t|t_start|t_end| 
+---+---+-------+-----+ 
| A| t1|  0| 3| 
| A| t2|  4| 6| 
| A| t3|  7| 9| 
| B| t1|  0| 2| 
| B| t2|  3| 6| 
| B| t3|  7| 9| 
+---+---+-------+-----+ 

我期望的輸出是識別「 t'表示df1中的每個時間戳,其中't'的範圍以df2表示。

df_output:

+---+------+----+---+ 
| id|weight|time| t | 
+---+------+----+---+ 
| A| 0.1| 1| t1| 
| A| 0.2| 2| t1| 
| A| 0.3| 4| t2| 
| A| 0.4| 5| t2| 
| B| 0.5| 1| t1| 
| B| 0.7| 3| t2| 
| B| 0.8| 6| t2| 
| B| 0.9| 7| t3| 
| B| 1.0| 8| t3| 
+---+------+----+---+ 

我的理解至今是我必須創建一個UDF,是以列'id'time作爲輸入,map對於每一行,通過指的df2.filter(df2.id == df1.id, df1.time >= df2.t_start, df1.time <= df2.t_end), and get the corresponding df2.t`

我對Scala和Spark非常陌生,所以我想知道這個解決方案是否有可能?

回答

1

不能使用UDF爲,但所有你需要做的就是重用你已經定義加入兩個幀過濾條件:既然你打上這個問題

df1.join(
    df2, 
    df2("id") === df1("id") && df1("time").between(df2("t_start"), df2("t_end")) 
) 
+0

[標籤:斯卡拉]'=== '是一個正確的操作員。 – zero323

+0

是的,你是對的。我不知道'===',並認爲這是一個錯字。我按照原來的方式糾正它,現在就可以使用! - ==和'==='有什麼區別? –

+0

'==='是一個SQL等式。 '=='比較那些沒有意義的列對象。 – zero323