java—使用另一个数据集的值搜索和更新spark数据集列

6fe3ivhb  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(351)

Java8和Spark2.11:2.3.2。虽然我非常喜欢javaapi的答案,但我会讲一点scala,所以我能够理解其中提供的任何答案!但是java如果可能的话(请)!
我有两个不同模式的数据集,除了一个公共的“ model_number “(string)列:存在于两者上的。
对于第一个数据集中的每一行(我们称之为 d1 ),我需要扫描/搜索第二个数据集(“ d2 )以查看是否有具有相同 model_number ,如果是,请更新另一个 d2 列。
以下是我的数据集架构:

d1
===========
model_number : string
desc : string
fizz : string
buzz : date

d2
===========
model_number : string
price : double
source : string

再说一遍,如果 d1 行有一个 model_number 比如说12345和 d2 行也有相同的 model_number ,我想更新 d2.price 把它乘以 10.0 .
我迄今为止最好的尝试是:

// I *think* this would give me a 3rd dataset with all d1 and d2 columns, but only
// containing rows from d1 and d2 that have matching 'model_number' values
Dataset<Row> d3 = d1.join(d2, d1.col("model_number") == d2.col("model_number"));

// now I just need to update d2.price based on matching
Dataset<Row> d4 = d3.withColumn("adjusted_price", d3.col("price") * 10.0);

有人能帮我越过终点线吗?提前谢谢!

mxg2im7a

mxg2im7a1#

这里有几点,正如@vamsiprabhala在评论中提到的,您需要使用的函数是 join 在你的特定领域。“关于” update “,你要记住这一点 df , ds 以及 rddspark 是不变的,所以你不能 update 他们。所以,这里的解决方案是,在 join 你的 df 的情况下,您需要在 select 或使用 withColumn 然后 select . 换句话说,您不能更新列,但可以创建新列 df “与” new “列。
例子:

Input data:

+------------+------+------+----+
|model_number|  desc|  fizz|buzz|
+------------+------+------+----+
|     model_a|desc_a|fizz_a|null|
|     model_b|desc_b|fizz_b|null|
+------------+------+------+----+

+------------+-----+--------+
|model_number|price|  source|
+------------+-----+--------+
|     model_a| 10.0|source_a|
|     model_b| 20.0|source_b|
+------------+-----+--------+

使用 join 将输出:

val joinedDF = d1.join(d2, "model_number")
joinedDF.show()

+------------+------+------+----+-----+--------+
|model_number|  desc|  fizz|buzz|price|  source|
+------------+------+------+----+-----+--------+
|     model_a|desc_a|fizz_a|null| 10.0|source_a|
|     model_b|desc_b|fizz_b|null| 20.0|source_b|
+------------+------+------+----+-----+--------+

应用您的计算:

joinedDF.withColumn("price", col("price") * 10).show()

output:
+------------+------+------+----+-----+--------+
|model_number|  desc|  fizz|buzz|price|  source|
+------------+------+------+----+-----+--------+
|     model_a|desc_a|fizz_a|null| 100.0|source_a|
|     model_b|desc_b|fizz_b|null| 200.0|source_b|
+------------+------+------+----+-----+--------+

相关问题