W przypadku Spark 2.1.0 moja sugestia byłaby taka, aby użyć head(n: Int)
lub take(n: Int)
z isEmpty
, w zależności od tego, który ma dla ciebie najwyraźniejszy zamiar.
df.head(1).isEmpty
df.take(1).isEmpty
z odpowiednikiem w Pythonie:
len(df.head(1)) == 0 # or bool(df.head(1))
len(df.take(1)) == 0 # or bool(df.take(1))
Użycie df.first()
i df.head()
zwróci, java.util.NoSuchElementException
jeśli DataFrame jest pusta. first()
dzwoni head()
bezpośrednio, co woła head(1).head
.
def first(): T = head()
def head(): T = head(1).head
head(1)
zwraca Array, więc przyjęcie head
tego Array powoduje java.util.NoSuchElementException
, że DataFrame jest pusta.
def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)
Więc zamiast wywoływać head()
, użyj head(1)
bezpośrednio, aby uzyskać tablicę, a następnie możesz użyć isEmpty
.
take(n)
jest również równoważne z head(n)
...
def take(n: Int): Array[T] = head(n)
I limit(1).collect()
jest równoważne head(1)
(zauważ limit(n).queryExecution
w head(n: Int)
metodzie), więc wszystkie poniższe są równoważne, przynajmniej z tego, co mogę powiedzieć, i nie będziesz musiał łapać java.util.NoSuchElementException
wyjątku, gdy DataFrame jest pusta.
df.head(1).isEmpty
df.take(1).isEmpty
df.limit(1).collect().isEmpty
Wiem, że jest to starsze pytanie, więc mam nadzieję, że pomoże to komuś korzystającemu z nowszej wersji Sparka.
df.rdd.isEmpty
?df.head(1)
zajmuje to dużo czasu, prawdopodobnie wynika to z tego, że Twójdf
plan wykonania robi coś skomplikowanego, co uniemożliwia iskierce pójście na skróty. Na przykład, jeśli czytasz tylko z plików parkietudf = spark.read.parquet(...)
, jestem prawie pewien, że Spark odczyta tylko jedną partycję plików. Ale jeślidf
robisz inne rzeczy, takie jak agregacje, możesz nieumyślnie zmusić Spark do czytania i przetwarzania dużej części, jeśli nie wszystkich, danych źródłowych.df.limit(1).count()
używałem naiwnie. W przypadku dużych zbiorów danych zajmuje to znacznie więcej czasu niż przykłady zgłoszone przez @ hulin003, które są prawie natychmiastowePowiedziałbym, żeby po prostu złapać podstawę
RDD
. W Scali:w Pythonie:
Biorąc to pod uwagę, wszystko, co to robi, to wezwanie
take(1).length
, więc zrobi to samo, co odpowiedział Rohan ... tylko może trochę bardziej jednoznacznie?źródło
Możesz skorzystać z funkcji
head()
(lubfirst()
), aby sprawdzić, czyDataFrame
ma jeden wiersz. Jeśli tak, to nie jest pusty.źródło
Jeśli tak
df.count > 0
. Bierze zliczenia wszystkich partycji we wszystkich wykonawcach i dodaje je do sterownika. Trwa to chwilę, gdy masz do czynienia z milionami wierszy.Najlepszym sposobem, aby to zrobić, jest wykonanie
df.take(1)
i sprawdzenie, czy jego wartość jest zerowa. To wróci,java.util.NoSuchElementException
więc lepiej spróbowaćdf.take(1)
.Dataframe zwraca błąd po zakończeniu
take(1)
zamiast pustego wiersza. Podkreśliłem konkretne wiersze kodu, w których zgłasza błąd.źródło
count
metoda zajmie trochę czasu.Od Spark 2.4.0 jest
Dataset.isEmpty
.Jego implementacja to:
Zauważ, że a
DataFrame
nie jest już klasą w Scali, to tylko alias typu (prawdopodobnie zmieniony w Spark 2.0):źródło
W przypadku użytkowników języka Java możesz użyć tego w zestawie danych:
To sprawdź wszystkie możliwe scenariusze (puste, null).
źródło
W Scali możesz użyć implicits, aby dodać metody
isEmpty()
inonEmpty()
do API DataFrame, co sprawi, że kod będzie nieco przyjemniejszy do czytania.Tutaj można również dodać inne metody. Aby użyć niejawnej konwersji, użyj
import DataFrameExtensions._
w pliku, którego chcesz użyć rozszerzonej funkcjonalności. Następnie metody można zastosować bezpośrednio, tak jak:źródło
Miałem to samo pytanie i przetestowałem 3 główne rozwiązania:
i oczywiście te 3 prace, jednak pod względem wydajności, oto co znalazłem podczas wykonywania tych metod na tym samym DF w mojej maszynie, pod względem czasu wykonania:
dlatego uważam, że najlepszym rozwiązaniem jest df.rdd.isEmpty, jak sugeruje @Justin Pihony
źródło
Zauważyłem, że w niektórych przypadkach:
to samo dotyczy „length” lub zamień take () na head ()
[Rozwiązanie] dla problemu, którego możemy użyć.
źródło
Jeśli korzystasz z Pypsark, możesz również:
źródło
Na PySpark, można również użyć tego
bool(df.head(1))
do uzyskaniaTrue
odFalse
wartościZwraca,
False
jeśli dataframe nie zawiera wierszyźródło
take
Sposób powraca tablicę rzędach, tak, że rozmiar tablicy jest równa zero, nie ma rekordydf
.źródło
dataframe.limit(1).count > 0
To również uruchamia pracę, ale ponieważ wybieramy pojedynczy rekord, nawet w przypadku miliardowych rekordów w skali zużycie czasu może być znacznie niższe.
Od: https://medium.com/checking-emptiness-in-distributed-objects/count-vs-isempty-surprised-to-see-the-impact-fa70c0246ee0
źródło
Możesz to zrobić tak:
źródło
schema
dwie ramki danych (sqlContext.emptyDataFrame
&df
) były takie same, aby kiedykolwiek zostały zwróconetrue
?eq
jest dziedziczona zAnyRef
i sprawdza, czy argument (that) jest odwołaniem do obiektu odbiornika (this).