Каков наилучший способ фильтрации множества столбцов в кадре данных Spark? - PullRequest
0 голосов
/ 16 января 2020

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

+--------------------+-----+--------+----+----------+--------+-----------+
|                  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()

Ответы [ 2 ]

1 голос
/ 16 января 2020

Причина этого в том, что ваш первый фрагмент

df.columns.map(col(_).contains("NULL"))

возвращает

Array[Column]

, и вы пытаетесь передать весь этот массив для поиска логического литерала "true" с этим оператор

df2.columns.map(col(_).contains("NULL")).contains(lit(true))

Поскольку это сложная структура Array[Column], он не работает.

Но это следующее выражение:

df.columns.map(col(_).contains("NULL")): _*

отправляет каждый из Элемент массива в качестве единственного аргумента один мой к функции isin, и, следовательно, ваш фильтр работает.

Надеюсь, это может объяснить!

0 голосов
/ 16 января 2020
df.filter(r=> r.toSeq.exists(c => c == null))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...