首页 > 解决方案 > 从 Spark Java API 中的另一个数据集替换行数据集

问题描述

我有两个数据集,如下所述

DS1:

R_REGIONKEY R_NAME R_COMMENT
0 非洲 拉尔存款。比...
1 美国 hs 使用讽刺,ev...

DS2:自定义加密程序从 DS1 中提取 R_NAME,调用 RestAPI 加密数据并创建以下数据集。

R_NAME
AVR8oDKFFNpuSWR9V..
AVR8oDL+si82n9k5g...

我想在 DS1 被下推以进行进一步处理之前,将 DS1 中的 R_NAME 替换为 DS2 中的 R_NAME。不能使用联合,因为数据帧不相同,并且连接正在创建重复项,因为两个数据帧之间没有共同的标识符。

有人可以用示例 Spark Java 解决方案指导我吗?提前致谢。

标签: apache-sparkapache-spark-sql

解决方案


我能够通过使用 monotonically_increasing_id() 方法在两个数据集中添加一个公共标识符来解决上述问题。

   Dataset<Row> df = spark.read().option("header",Boolean.TRUE).
                csv("/opt/REGION_202107282300.csv");
   Dataset<Row> dfWithUniqueId = df.withColumn("IDX", monotonically_increasing_id());
   dfWithUniqueId.show(); 

DS1:
| R_REGIONKEY | R_NAME | R_COMMENT | IDX | | -------- | -------- | ------ | - | | 0 | 非洲 | 拉宝糖 | 0 | | 1 | 美国 | s 使用讽刺 | 1 | | 2 | 亚洲 | 格斯。薄均匀| 2 |

DS2:自定义加密程序从 DS1 中提取 R_NAME,调用 RestAPI 将数据与来自 DS1 的 IDX 值一起加密,并使用来自 DS1 的 IDX 值创建以下数据集。

IDX R_NAME
0 AVR8oDKFFNpuSWR9V...
1 AVR8oDL+si82n9k5g...
2 AVR8oDK5VjuvWtnPB...

在 IDX 列上实现 join 方法

Dataset<Row> DS3 = DS1.join(DS2,DS1.col("IDX).equalTo(DS2.col("IDX)));

推荐阅读