Пример данных:
+--------------------+-----+--------+----+----------+--------+-----------+
| id|click| hour| C1|banner_pos| site_id|site_domain|
+--------------------+-----+--------+----+----------+--------+-----------+
| NULL | 0|14102100|1005| 0|1fbe01fe| f3845767|
|10000169349117863715| 0|14102100|1005| 0|1fbe01fe| f3845767|
|10000371904215119486| 0|NULL |1005| 0|1fbe01fe| f3845767|
|10000640724480838376| 0|14102100|1005| 0|1fbe01fe| f3845767|
|10000679056417042096| 0|14102100|1005| 1|fe8cc448| 9166c161|
+--------------------+-----+--------+----+----------+--------+-----------+
Ожидаемый результат:
+--------------------+-----+--------+----+----------+--------+-----------+
| id|click| hour| C1|banner_pos| site_id|site_domain|
+--------------------+-----+--------+----+----------+--------+-----------+
| NULL | 0|14102100|1005| 0|1fbe01fe| f3845767|
|10000371904215119486| 0|NULL |1005| 0|1fbe01fe| f3845767|
+--------------------+-----+--------+----+----------+--------+-----------+
Я хочу отфильтровать все столбцы в кадре данных с условием, что хотя бы один столбец содержит строку «NULL» , У меня много столбцов, около 30. Я видел, что с несколькими столбцами можно добавлять условия, например this :
df2 = df1.filter($"Status" === 2 || $"Status" === 3)
Но поскольку у меня много столбцов с одинаковыми условиями, Есть ли способ рассматривать columns
как коллекцию и фильтровать их все вместе? Я пробовал следующее, но это не похоже на работу:
df2.filter(
lit(
df2.columns.map(col(_).contains("NULL")).contains(lit(true))
)
).show()
Кажется, df2.columns.map(col(_).contains("NULL")).contains(lit(true))
всегда возвращает false
.
Почему это так? Не могли бы вы объяснить, почему это не работает?
Следующие коды работают для вышеуказанной цели.
df.filter(
lit(true).isin(df.columns.map(col(_).contains("NULL")): _*)
).show()