2016-07-07 6 views
1

を参照:Scalaのスパーク地図機能私は2つのデータフレームを持っている別のデータフレーム

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| 
+---+---+-------+-----+ 

マイ所望の出力が "識別することです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| 
+---+------+----+---+ 
私の理解では、これまでのところ、私は

df2.t` df2.filter(df2.id == df1.id, df1.time >= df2.t_start, df1.time <= df2.t_end), and get the correspondingに参照のうえで、行ごとに列 'idと入力として 'timemapを取るUDFを作成しなければならないということです

私はScalaとSparkの新機能ですから、この解決策が可能かどうかは疑問です。

あなたはそのためのUDFを使用することはできませんが、あなたがしなければならないすべてはあなたがすでに両方のフレームを結合するために定義されたフィルタ条件を再利用することである

答えて

1

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

あなたがこの質問をマークしているので、[タグ:スカラ] '=== 'は正しい演算子です。 – zero323

+0

はい、あなたは正しいです。私は '==='について知らなかったし、それがタイプミスだと思った。あなたがそれを持っていたので、私はそれを元に戻しました。 - '=='と '==='の違いは何ですか? –

+0

'==='はSQLの等価性です。 '=='は、意味のない列オブジェクトを比較します。 – zero323

関連する問題