繁体   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