Как я могу создать 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
Вообще говоря, здесь нет необходимости в 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: _*)