簡體   English   中英

通過從 Scala 中的另一個數據幀中獲取值,根據行類別在 spark 數據幀中輸入空值

[英]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_gn5mean_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.

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