![](/img/trans.png)
[英]Spark Scala: How to replace null with values from an array or another dataframe
[英]Imputing null values in spark dataframe, based on the row category, by fetching the values from another dataframe in Scala
所以我有一個如下所示的數據mean_value_gn5
,它已被存儲為名為mean_value_gn5
的臨時視圖,以便我可以在需要獲取數據時使用sql()
進行查詢。
+-------+----+
|Species|Avgs|
+-------+----+
| NO2| 43|
| NOX| 90|
| NO| 31|
+-------+----+
此數據框存儲使用ceil()
函數四舍五入到最接近的整數的“物種”的分類平均值。 我需要使用這些分類平均值來clean_gn5
我感興趣的數據clean_gn5
Value
列的缺失值clean_gn5
。 我創建了一個新列Value_imp
,它將保存我的最后一列與估算值。
我嘗試這樣做:
clean_gn5 = clean_gn5.withColumn("Value_imp",
when($"Value".isNull, sql("Select Avgs from mean_value_gn5 where Species = "+$"Species").select("Avgs").head().getLong(0).toInt)
.otherwise($"Value"))
上面提到的代碼運行,但值被錯誤地估算,即對於包含Species
作為NO
的行,估算的值是43
而不是31
。
在執行此操作之前,我首先檢查是否能夠通過執行以下操作正確獲取值:
println(sql("Select Avgs from mean_value_gn5 where Species = 'NO'").select("Avgs").head().getLong(0))
在對Species
進行硬編碼后,我能夠正確獲取值,並且根據我的理解, $"Species"
應該可以幫助我獲取與該特定行的Species
列對應的值。
此外,我認為我可能缺少圍繞硬編碼Species
值的單引號,即'NO'
。 所以我嘗試執行以下操作
clean_gn5 = clean_gn5.withColumn("Value_imp",
when($"Value".isNull, sql("Select Avgs from mean_value_gn5 where Species = '"+$"Species"+"'").select("Avgs").head().getLong(0).toInt)
.otherwise($"Value"))
但這導致了以下異常。
Exception in thread "main" java.util.NoSuchElementException: next on empty iterator
我對 Spark 和 Scala 相當陌生。
讓我們假設clean_gn5
包含數據
+-------+-----+
|Species|Value|
+-------+-----+
| NO2| 2.3|
| NOX| 1.1|
| NO| null|
| ABC| 4.0|
| DEF| null|
| NOX| null|
+-------+-----+
使用左連接將clean_gn5
與mean_value_gn5
連接將導致
+-------+-----+----+
|Species|Value|Avgs|
+-------+-----+----+
| NO2| 2.3| 43|
| NOX| 1.1| 90|
| NO| null| 31|
| ABC| 4.0|null|
| DEF| null|null|
| NOX| null| 90|
+-------+-----+----+
在此數據框中,您可以每行應用您在問題中已經給出的邏輯,結果是(刪除 Avgs 列后):
+-------+-----+---------+
|Species|Value|Value_imp|
+-------+-----+---------+
| NO2| 2.3| 2.3|
| NOX| 1.1| 1.1|
| NO| null| 31.0|
| ABC| 4.0| 4.0|
| DEF| null| null|
| NOX| null| 90.0|
+-------+-----+---------+
編碼:
clean_gn5.join(mean_value_gn5, Seq("Species"), "left")
.withColumn("Value_imp", when('value.isNull, 'Avgs).otherwise('value))
.drop("Avgs")
.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.