[英]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 中的所有行, dataSetTableRight
在time
匹配時從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.