У меня есть dataframe
с 5 столбцами. Мне нужно динамически проверять столбцы на наличие нулевых значений и заменять их средним значением предыдущего и следующего значения, ожидая код scala
Мне удалось динамически проверить нулевые значения и отфильтровать его. Но я не понимаю, как обновить его с помощью среднего значения вместо нулевого
val df = spark.createDataFrame(Seq(
| (1, Some(5), 2, "F"),
| (2, Some(2), 4, "F"),
| (3, None, 6, "N"),
| (4, Some(3), 8, "F")
| )).toDF("ACCT_ID", "M_CD", "C_CD","IND")
df: org.apache.spark.sql.DataFrame = [ACCT_ID: int, M_CD: int ... 2 more fields]
создано условие фильтра для динамической проверки
val filterCond = df.columns.map(x=>col(x).isNotNull).reduce(_ && _)
filterCond: org.apache.spark.sql.Column = ((((ACCT_ID IS NOT NULL) AND (M_CD IS NOT NULL)) AND (C_CD IS NOT NULL)) AND (IND IS NOT NULL))
применил его к фрейму данных:
s
cala> val df1 = df.filter(filterCond)
df1: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [ACCT_ID: int, M_CD: int ... 2 more fields]
scala> df1.show
+-------+----+----+---+
|ACCT_ID|M_CD|C_CD|IND|
+-------+----+----+---+
| 1| 5| 2| F
2| 2| 4| F|
| 4| 3| 8| F|
+-------+----+----+---+
Я могу получить ненулевые строки. Не могу сделать логику для замены нулевых значений
Я уже обновился выше
я / р:
a1 a2 a3 a4 a5
1 5 8 9 10
? 6 8 2 3
5 4 6 ? 1
? 5 ? 6 4
4 2 3 4 4
выход:
a1 a2 a3 a4 a5
1 5 8 9 10
3 6 8 2 3
5 4 6 4 1
4 5 4 6 4
4 2 3 4 4