2017-08-07 6 views
1

タイムスタンプ値のリストとタイムスタンプウィンドウのリストを結合する有効な方法はありますか?私が使用しようPyspark - タイムスタンプ値とタイムスタンプ値との結合

+------------------------------------+------------------+ 
|userid  |eventtime   |distance   | 
+------------------------------------+------------------+ 
|9f034a1d-02c1|2017-06-04 03:00:00.0|0.17218625176420413| 
|9f034a1d-02c1|2017-06-04 03:00:00.0|0.11145767867097957| 
|9f034a1d-02c1|2017-06-04 03:00:00.0|0.14064932728588236| 
|a3fac437-efcc|2017-06-04 03:00:00.0|0.08328915597349452| 
|a3fac437-efcc|2017-06-04 03:00:00.0|0.07079054693441306| 
+------------------------------------+------------------+ 

:ウィンドウのデータ型がstruct<start:timestamp,end:timestamp>

そして、データフレームBである

+------------------------------------+---------------------------------------------+----------------------+ 
|userid  |     window     |total_unique_locations| 
+------------------------------------+---------------------------------------------+----------------------+ 
|da24a375-962a|[2017-06-04 03:20:00.0,2017-06-04 03:25:00.0]|2      | 
|0fd2b419-d6ec|[2017-06-04 03:50:00.0,2017-06-04 03:55:00.0]|2      | 
|c8159400-fe0a|[2017-06-04 03:10:00.0,2017-06-04 03:15:00.0]|2      | 
|a4336494-3a10|[2017-06-04 03:00:00.0,2017-06-04 03:05:00.0]|3      | 
|b4590016-1af2|2017-06-04 03:45:00.0,2017-06-04 03:50:00.0] |2      | 
|03b33b0a-e94e|[2017-06-04 03:30:00.0,2017-06-04 03:35:00.0]|2      | 
|e5e4c972-6599|[2017-06-04 03:25:00.0,2017-06-04 03:30:00.0]|5      | 
|345e81fb-5e12|[2017-06-04 03:50:00.0,2017-06-04 03:55:00.0]|2      | 
|bedd88f1-3751|[2017-06-04 03:20:00.0,2017-06-04 03:25:00.0]|2      | 
|da401dab-e7f3|[2017-06-04 03:20:00.0,2017-06-04 03:25:00.0]|2      | 
+------------------------------------+---------------------------------------------+----------------------+ 

これらの値を有する:

データフレームのAは、これらの値を有しています通常の結合ですが、ウィンドウとイベント時に異なるデータ型があるため動作しません。

A.join(B, A.userid == B.userid, A.window == B.eventtime).select("*") 

お勧めはありますか?

答えて

1

少ない効率的な解決策は、join又はbeteweencrossJoinである:

a.join(b, col("eventtime").between(col("window.start"), col("window.end"))) 

より効率的なソリューションは、既存のウィンドウのために使用したのと同じ定義を有するstructeventtimeを変換することです。たとえば、次のように

(b 
    .withColumn("event_window", window(col("eventtime"), "5 minutes")) 
    .join(a, col("event_window") == col("window"))) 
0

これらの2つを結合することはできません。ウィンドウとイベント時間のデータ型が異なるからです。

val result = A.join(B, 
    A("userid") === B("userid") && 
    A("window.start") === B("eventtime") || 
    A("window.end") === B("eventtime"), "left") 

+0

答えてくれてありがとう、それはうまくいきませんでした: 'u」が原因のデータ型の不一致に『( 'window')爆発』解決することはできません:関数への入力爆発は、配列やマップタイプのものでなければならない、ではありませんStructType(StructField(start、TimestampType、true)、StructField(end、TimestampType、true)) ' – ebertbm

+0

@ebertbmは答えを更新しました。 –

関連する問題