Ввод нулевых значений в кадре данных искры на основе категории строки путем извлечения значений из другого кадра данных в Scala - PullRequest
0 голосов
/ 20 марта 2020

Итак, у меня есть фрейм данных, как показано ниже, который был сохранен как временное представление под именем mean_value_gn5, так что я могу запрашивать, используя sql(), всякий раз, когда мне нужно получить данные.

+-------+----+
|Species|Avgs|
+-------+----+
|    NO2|  43|
|    NOX|  90|
|     NO|  31|
+-------+----+

В этом информационном кадре хранится среднеквадратичное значение «видов», округленное до ближайшего целого числа с использованием функции ceil(). Мне нужно использовать эти категорические средние значения, чтобы рассчитать отсутствующие значения столбца 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.

1 Ответ

2 голосов
/ 20 марта 2020

Предположим, 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|
+-------+-----+----+

На этом кадре данных вы можете применить в строке указаны логики c, которые вы уже указали в своем вопросе, и результат (после удаления столбца 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...