[英]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.