假设您有一个包含以下记录的数据集A:
Dataset A:
{key1, val1}
{key2, val2}
{key3, val3}
Dataset B:
{key4, val4}
{key1, valBB}
{key5, valN}
{key2, NNNNN}
"更新"发生这是最终的数据集应该是什么样的:
Dataset Final:
{key1, valBB}
{key2, NNNNN}
{key3, val3}
{key4, val4}
{key5, valN}
到目前为止,我采用的方法是将两个数据集转换为JavaRDD,然后转换JavaRDD - > JavaPairRDD,然后是firstPairRDD.subtractByKey(secondPairRDD)。这给了我数据集A中存在但不存在于数据集B中的记录。然后我将其重新转换回数据集。下一步是我使用数据集B进行联盟,以便为我提供更新的数据集。对我来说,这并没有给我我预期的结果。我采取了错误的做法吗?任何帮助将不胜感激。
答案 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世界并避免添加额外的代码。
看看这个:
更多关于左反加入:
what is the difference between an anti-join and an anti semi join?