簡體   English   中英

使用來自另一個數據集的值搜索和更新 Spark 數據集列

[英]Searching and updating a Spark Dataset column with values from another Dataset

此處為 Java 8 和 Spark 2.11:2.3.2。 雖然我非常喜歡 Java API 答案,但我確實會說一點 Scala,所以我能夠理解其中提供的任何答案! 但是 Java 如果可能的話(請)!

我有兩個具有不同架構的數據集,除了一個常見的“ model_number ”(字符串)列:兩者都存在。

對於我的第一個數據集中的每一行(我們稱之為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 ,我想通過將它乘以10.0來更新d2.price

迄今為止我最好的嘗試:

// 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);

誰能幫我在這里越過終點線? 提前致謝!

這里有幾點,正如@VamsiPrabhala 在評論中提到的,您需要使用的功能是join您的特定字段。 關於“ update ”,你需要記住spark中的dfdsrdd是不可變的,所以你不能update它們。 所以,這里的解決方案是,在join你的df之后,你需要執行你的計算,在這種情況下是乘法,在select或使用withColumn然后select 換句話說,您不能更新列,但可以使用“ new ”列創建新的df

例子:

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|
+------------+------+------+----+-----+--------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM