簡體   English   中英

Java + Apache 兩個日期集之間的 Spark 內部連接

[英]Java + Apache Spark inner join between two datesets

關於如何使用 Apache Spark 和 Java 實現內部連接的小問題。

我有這段非常簡單的代碼。

final Dataset<Row> dataSetTableLeft = getDatasetForLeft();
final Dataset<Row> dataSetTableRight = getDatasetForRight();
final Dataset<Row> dataSetTableResult = dataSetTableLeft.join(dataSetTableRight);

dataSetTableLeft.show();
dataSetTableRight.show();
dataSetTableResult.show();

第一個表dataSetTableLeft.show ,看起來像這樣,非常簡單。

+----------+-----+
|      time|label|
+----------+-----+
|1637020800|    0|
|1637107200|    0|
|1637193600|    0|
|1637280000|    0|
|1637366400|    0|
|1637452800|    0|
+----------+-----+"

第二個表dataSetTableRight ,看起來像這樣,也很簡單。

+----------+-----+
|      time|label|
+----------+-----+
|1637193600|    1|
|1637280000|    2|
|1637366400|    1|
+----------+-----+"

我想要實現的是這樣的結果表,它是一種內連接。

+----------+-----+
|      time|label|
+----------+-----+
|1637020800|    0|
|1637107200|    0|
|1637193600|    1|
|1637280000|    2|
|1637366400|    1|
|1637452800|    0|
+----------+-----+"

不幸的是,我沒有看到任何這樣的 function。 innerjoin()

因此,我正在嘗試某種組合

dataSetTableLeft.unionAll(dataSetTableRight);
dataSetTableLeft.crossJoin(dataSetTableRight);

到目前為止沒有任何運氣。

實現內連接的正確方法是什么?

先執行anti join ,然后再執行union

dataSetTableLeft.join(dataSetTableRight, on='time', how='anti').union(dataSetTableRight)

內連接只會為您提供兩個數據集中存在的行。 您在這里想要的是保留 dataSetTableLeft 中的所有行, dataSetTableRighttime匹配時從dataSetTableLeft檢索label值。

為此,只需使用左連接並coalesce function 即可在匹配時從第二個數據集中獲取label值。

我沒有使用 Spark-Java 來測試它,但這樣的事情應該會給你預期的結果:

import static org.apache.spark.sql.functions.*;


dataSetTableLeft.join(
    dataSetTableRight,
    dataSetTableLeft.col("time").equalTo(dataSetTableRight.col("time")),
    "left_outer"
).select(
    dataSetTableLeft.col("time"),
    coalesce(dataSetTableRight.col("label"), dataSetTableLeft.col("label")).alias("label")
).show();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM