Проверьте, содержит ли dataframe нулевые значения - PullRequest
1 голос
/ 03 мая 2019

У меня есть датафрейм, и мне нужно посмотреть, содержит ли он нулевые значения.Есть много постов на одну и ту же тему, но почти все они используют действие count или метод show.

count операции в моем случае непомерно дороги, так как объем данных велик.То же самое для метода show.

Есть ли способ, с помощью которого я могу попросить спарк искать нулевые значения и выдавать ошибку, как только он встречает первое нулевое значение?

Решения в других сообщениях дают количество пропущенных значений в каждом столбце.Мне не нужно знать количество пропущенных значений в каждом столбце.Я просто хочу знать, есть ли в кадре данных какая-либо ячейка с нулевым значением.

Ответы [ 3 ]

2 голосов
/ 03 мая 2019

Вы должны пройти через все значения и проверить наличие нулевых значений. Это может быть сделано путем обхода кадра данных по столбцам или по строкам. Какой из них лучше, зависит от данных (используйте эвристику).

Строка обхода:

import pyspark.sql.functions as f
from functools import reduce

df.where(reduce(lambda x, y: x | y, (f.col(x).isNull() for x in df.columns))).limit(1).collect().isEmpty

Обход по столбцам (опытным путем это должно быть быстрее , см. Комментарий Clock Slave):

import pyspark.sql.functions as f

contains_nulls = False
for c in df.columns:
  if not df.where(f.col(c).isNull()).limit(1).collect().isEmpty:
    contains_nulls = True
    break

limit(1) используется для остановки, когда найдено первое нулевое значение, и collect().isEmpty, чтобы проверить, пустой ли фрейм данных.

1 голос
/ 03 мая 2019

Вы можете использовать limit для этого

df.select("*").where(col("c").isNull()).limit(1)
0 голосов
/ 03 мая 2019

Как я понимаю, ваше требование - просто поднять флаг, если в каком-либо столбце есть ноль.Вам не нужно знать, какие все фактические строки имеют значение NULL.

Решение: Самый простой способ, который я могу придумать, - создать tempView вашего DataFrame и проверить NULL на всех возможностях.Вот псевдокод для этого -

YourDF.createOrReplaceTempView("tempView")
tempViewDF = sqlContext.sql("SELECT count(*) FROM tempView WHERE Col1 is null or Col2 is null or col3 is null")

flag=flase

if tempViewDF > 0:
  flag=true

Теперь используйте флаг как хотите.

С уважением, Anupam

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...