如何使用另一个数据集<row>中的记录更新数据集<row>,这些记录在使用JAVA API的Spark中具有相同的模式?

时间:2017-06-07 22:41:08

标签: java apache-spark apache-spark-sql apache-spark-dataset

假设您有一个包含以下记录的数据集A:

Dataset A:
    {key1, val1}
    {key2, val2}
    {key3, val3}

Dataset B:
    {key4, val4}
    {key1, valBB}
    {key5, valN}
    {key2, NNNNN}

&#34;更新&#34;发生这是最终的数据集应该是什么样的:

Dataset Final:
    {key1, valBB}
    {key2, NNNNN}
    {key3, val3}
    {key4, val4}
    {key5, valN}

到目前为止,我采用的方法是将两个数据集转换为JavaRDD,然后转换JavaRDD - &gt; JavaPairRDD,然后是firstPairRDD.subtractByKey(secondPairRDD)。这给了我数据集A中存在但不存在于数据集B中的记录。然后我将其重新转换回数据集。下一步是我使用数据集B进行联盟,以便为我提供更新的数据集。对我来说,这并没有给我我预期的结果。我采取了错误的做法吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

我最终找到了一个更有效的解决方案:

    Dataset<Row> existsInAButNotB = A.join(B, A.col("key").equalTo(B.col("key") "left_anti");
    Dataset<Row> Final = existsInAButNotB.union(B); 

如果您有多个列用作密钥,那么您的解决方案应如下所示:

Dataset<Row> existsInAButNotB = A.join(B, A.col("key1").equalTo(B.col("key1").and(A.col("key2").equalTo(B.col("key2")) "left_anti");

这个内核避免了用户进入效率低下的RDD世界并避免添加额外的代码。

看看这个:

Left Anti join in Spark?

更多关于左反加入:

what is the difference between an anti-join and an anti semi join?

数据集加入API: https://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/Dataset.html#join(org.apache.spark.sql.Dataset,%20org.apache.spark.sql.Column,%20java.lang.String)