Прямо сейчас я должен использовать, df.count > 0
чтобы проверить DataFrame
, пуст или нет. Но это неэффективно. Есть ли лучший способ сделать это?
Спасибо.
PS: я хочу проверить, пуст ли он, чтобы я сохранял только, DataFrame
если он не пустой
Прямо сейчас я должен использовать, df.count > 0
чтобы проверить DataFrame
, пуст или нет. Но это неэффективно. Есть ли лучший способ сделать это?
Спасибо.
PS: я хочу проверить, пуст ли он, чтобы я сохранял только, DataFrame
если он не пустой
Для Spark 2.1.0 я бы посоветовал использовать head(n: Int)
или take(n: Int)
с isEmpty
, в зависимости от того, что вам больше всего подходит .
df.head(1).isEmpty
df.take(1).isEmpty
с эквивалентом Python:
len(df.head(1)) == 0 # or bool(df.head(1))
len(df.take(1)) == 0 # or bool(df.take(1))
Использование df.first()
и df.head()
будет возвращать, java.util.NoSuchElementException
если DataFrame пуст. first()
звонит head()
напрямую, который звонит head(1).head
.
def first(): T = head()
def head(): T = head(1).head
head(1)
возвращает массив, поэтому принятие head
этого массива вызывает, java.util.NoSuchElementException
когда DataFrame пуст.
def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)
Поэтому вместо вызова head()
используйте head(1)
напрямую для получения массива, а затем вы можете использовать isEmpty
.
take(n)
также эквивалентно head(n)
...
def take(n: Int): Array[T] = head(n)
И limit(1).collect()
это эквивалентно head(1)
(замечание limit(n).queryExecution
в head(n: Int)
методе), поэтому все следующие java.util.NoSuchElementException
варианты эквивалентны, по крайней мере, из того, что я могу сказать, и вам не придется перехватывать исключение, когда DataFrame пуст.
df.head(1).isEmpty
df.take(1).isEmpty
df.limit(1).collect().isEmpty
Я знаю, что это старый вопрос, поэтому, надеюсь, он поможет кому-то, кто использует более новую версию Spark.
df.rdd.isEmpty
?df.head(1)
это уходит много времени, возможно , это потому, что в вашемdf
плане выполнения есть что-то сложное, что не позволяет Spark использовать ярлыки. Например, если вы просто читаете паркетные файлыdf = spark.read.parquet(...)
, я уверен, что Spark будет читать только один файловый раздел. Но если выdf
делаете другие вещи, такие как агрегирование, вы можете непреднамеренно заставить Spark читать и обрабатывать большую часть, если не все, ваших исходных данных.df.limit(1).count()
наивно. На больших наборах данных это занимает гораздо больше времени, чем приведенные примеры @ hulin003, которые почти мгновенныЯ бы сказал, просто захватить основную
RDD
. В Scala:в Python:
При этом все, что он делает, - это вызов
take(1).length
, поэтому он будет делать то же самое, что ответил Рохан ... только, может быть, немного более явно?источник
Вы можете воспользоваться функциями
head()
(илиfirst()
), чтобы узнать, есть ли уDataFrame
них одна строка. Если так, то он не пустой.источник
Если да
df.count > 0
. Он подсчитывает количество всех разделов по всем исполнителям и складывает их в Driver. Это займет некоторое время, когда вы имеете дело с миллионами строк.Лучший способ сделать это - выполнить
df.take(1)
и проверить, является ли он нулевым. Это вернется,java.util.NoSuchElementException
так что лучше попробоватьdf.take(1)
.При выполнении фрейм данных возвращает ошибку
take(1)
вместо пустой строки. Я выделил конкретные строки кода, в которых возникает ошибка.источник
count
метод займет некоторое время.Начиная с Spark 2.4.0 существует
Dataset.isEmpty
.Его реализация :
Обратите внимание, что a
DataFrame
больше не является классом в Scala, это просто псевдоним типа (вероятно, измененный в Spark 2.0):источник
Для пользователей Java вы можете использовать это в наборе данных:
Это проверяет все возможные сценарии (пустой, нулевой).
источник
В Scala вы можете использовать имплициты для добавления методов
isEmpty()
иnonEmpty()
в API DataFrame, что сделает код более удобным для чтения.Здесь также могут быть добавлены другие методы. Чтобы использовать неявное преобразование, используйте
import DataFrameExtensions._
в файле, в котором вы хотите использовать расширенные функции. Впоследствии методы можно использовать напрямую так:источник
У меня был тот же вопрос, и я протестировал 3 основных решения:
и, конечно же, эти 3 работы, однако с точки зрения перферманса, вот что я обнаружил при выполнении этих методов на одном и том же DF на моей машине во время выполнения:
поэтому я думаю, что лучшим решением является df.rdd.isEmpty, как предлагает @Justin Pihony
источник
Я обнаружил, что в некоторых случаях:
это то же самое для "length" или заменить take () на head ()
[Решение] проблемы, которую мы можем использовать.
источник
Если вы используете Pypsark, вы также можете:
источник
На PySpark, вы также можете использовать это
bool(df.head(1))
для полученияTrue
изFalse
значенияОн возвращается,
False
если фрейм данных не содержит строкисточник
take
Метод возвращает массив строк, так что если размер массива равен нулю, нет записей вdf
.источник
dataframe.limit(1).count > 0
Это также запускает задание, но, поскольку мы выбираем одну запись, даже в случае записи в миллиард масштабов затраты времени могут быть намного ниже.
Источник: https://medium.com/checking-emptiness-in-distributed-objects/count-vs-isempty-surprised-to-see-the-impact-fa70c0246ee0
источник
Сделать это можно так:
источник
schema
чтобы два фрейма данных (sqlContext.emptyDataFrame
&df
) были одинаковыми, чтобы когда-либо вернутьсяtrue
?eq
наследуется отAnyRef
и проверяет, является ли аргумент (that) ссылкой на объект-получатель (this).