如何更新数据集<;世界其他地区>;使用来自另一个数据集的记录<;世界其他地区>;Spark中哪些模式与JAVA API相同?
假设您有一个具有以下记录的数据集a:如何更新数据集<;世界其他地区>;使用来自另一个数据集的记录<;世界其他地区>;Spark中哪些模式与JAVA API相同?,java,apache-spark,apache-spark-sql,apache-spark-dataset,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} “更新”发生后,最终数据集应该是这样的: Dataset Final: {key1, valBB} {key2, NNNNN} {key3, val
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->JavaPairdd,然后转换firstPairdd.subtractByKey(secondPairdd)。这给了我数据集A中存在但数据集B中不存在的记录。然后我将其重新转换回数据集。下一步是与DatasetB进行联合,以获得更新的数据集。对我来说,这并没有给我预期的结果。我采取了错误的方法吗?任何帮助都将不胜感激。我最终找到了一个更有效的解决方案:
Dataset<Row> existsInAButNotB = A.join(B, A.col("key").equalTo(B.col("key") "left_anti");
Dataset<Row> Final = existsInAButNotB.union(B);
Dataset existsInAButNotB=A.join(B,A.col(“key”).equalTo(B.col(“key”)“left_anti”);
Dataset 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");
Dataset existsInAButNotB=A.join(B,A.col(“key1”).equalTo(B.col(“key1”))和(A.col(“key2”).equalTo(B.col(“key2”))“left_anti”);
这一行程序避免了用户进入低效的RDD世界,也避免了添加额外的代码
看看这个:
有关左侧反连接的更多信息,请参见此处:
数据集连接API: