Spark: заменить нулевые значения в кадре данных на среднее значение столбца

1

Как я могу создать UDF для программной замены нулевых значений в блоке данных искры в каждом столбце со средним значением столбца. например, в примере data col1 null value будет иметь значение ((2 + 4 + 6 + 8 + 5)/5) = 5.

Пример данных:

col1    col2    col3
2       null    3
4       3       3
6       5       null
8       null    2
null    6       4
5       2       8

Требуемые данные:

col1    col2    col3
2       4       3
4       3       3
6       5       4
8       4       2
5       6       4
5       2       8
  • 0
    в Pure SQl это может быть достигнуто путем перекрестного соединения таблицы для каждого столбца и использования объединения (col1, crossJoinTBL.Col1Avg), но на самом деле это не UDF. если бы вы передали столбец таблицы и использовали динамический SQL для вычисления avg и снова использовали coalesce, это может сработать ...
Теги:
apache-spark

1 ответ

3

Вообще говоря, здесь нет необходимости в UDF. Все, что вы на самом деле являетесь агрегированной таблицей:

val df = Seq(
  (Some(2), None, Some(3)), (Some(4), Some(3), Some(3)),
  (Some(6), Some(5), None), (Some(8), None, Some(2)),
  (None, Some(6), Some(4)), (Some(5), Some(2), Some(8))
).toDF("col1", "col2", "col3").alias("df")

val means = df.agg(df.columns.map(c => (c -> "avg")).toMap)

И транслируется декартово с coalesce:

val exprs = df.columns.map(c => coalesce(col(c), col(s"avg($c)")).alias(c))

df.join(broadcast(means)).select(exprs: _*)
  • 0
    Отлично. Это работает отлично. Большое спасибо. пришлось добавить следующие библиотеки. import sqlctx.implicits._ import org.apache.spark.sql.functions. {coalesce, lit, broadcast}
  • 0
    Нулевые ваши навыки работы с Scala Spark безумны ... Тем не менее, немного больше информации о том, как на самом деле работает ваш супер красивый и компактный код.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню