Für Spark 2.1.0 würde ich vorschlagen, head(n: Int)
oder take(n: Int)
mit zu verwenden isEmpty
, je nachdem, was für Sie die klarste Absicht ist.
df.head(1).isEmpty
df.take(1).isEmpty
mit Python-Äquivalent:
len(df.head(1)) == 0 # or bool(df.head(1))
len(df.take(1)) == 0 # or bool(df.take(1))
Mit df.first()
und df.head()
geben beide zurück, java.util.NoSuchElementException
wenn der DataFrame leer ist. first()
ruft head()
direkt an, was anruft head(1).head
.
def first(): T = head()
def head(): T = head(1).head
head(1)
Gibt ein Array zurück. Wenn Sie head
dieses Array java.util.NoSuchElementException
übernehmen, ist der DataFrame leer.
def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)
Anstatt also aufzurufen head()
, verwenden Sie head(1)
direkt, um das Array abzurufen, und dann können Sie es verwenden isEmpty
.
take(n)
ist auch gleichbedeutend mit head(n)
...
def take(n: Int): Array[T] = head(n)
Und limit(1).collect()
ist äquivalent zu head(1)
(Hinweis limit(n).queryExecution
in der head(n: Int)
Methode), daher sind alle folgenden äquivalent, zumindest soweit ich java.util.NoSuchElementException
das beurteilen kann, und Sie müssen keine Ausnahme abfangen, wenn der DataFrame leer ist.
df.head(1).isEmpty
df.take(1).isEmpty
df.limit(1).collect().isEmpty
Ich weiß, dass dies eine ältere Frage ist. Hoffentlich hilft sie jemandem, der eine neuere Version von Spark verwendet.
df.rdd.isEmpty
?df.head(1)
es viel Zeit in Anspruch nimmt, liegt es wahrscheinlich daran, dass Ihrdf
Ausführungsplan etwas Kompliziertes tut, das verhindert, dass Funken Verknüpfungen verwenden. Wenn Sie beispielsweise nur aus Parkettdateien lesendf = spark.read.parquet(...)
, bin ich mir ziemlich sicher, dass spark nur eine Dateipartition liest. Wenn Siedf
jedoch andere Dinge wie Aggregationen ausführen, erzwingen Sie möglicherweise versehentlich den Funken, einen großen Teil, wenn nicht alle Ihrer Quelldaten zu lesen und zu verarbeiten.df.limit(1).count()
naiv verwendet. Bei großen Datenmengen dauert es viel länger als bei den von @ hulin003 gemeldeten Beispielen, die fast augenblicklich sindIch würde sagen, nur den Basiswert zu ergreifen
RDD
. In Scala:in Python:
Davon abgesehen ist alles, was dies tut, ein Anruf
take(1).length
, also wird es das Gleiche tun, wie Rohan geantwortet hat ... nur vielleicht etwas expliziter?quelle
Sie können die
head()
(oderfirst()
) Funktionen nutzen, um festzustellen, ob dasDataFrame
eine einzelne Zeile hat. Wenn ja, ist es nicht leer.quelle
Seit Spark 2.4.0 gibt es
Dataset.isEmpty
.Die Implementierung ist:
Beachten Sie, dass a
DataFrame
in Scala keine Klasse mehr ist, sondern nur ein Typalias (wahrscheinlich mit Spark 2.0 geändert):quelle
Für Java-Benutzer können Sie dies für einen Datensatz verwenden:
Dies überprüft alle möglichen Szenarien (leer, null).
quelle
Wenn du das tust
df.count > 0
. Es zählt die Anzahl aller Partitionen aller Executoren und addiert sie bei Driver. Dies kann eine Weile dauern, wenn Sie mit Millionen von Zeilen arbeiten.Der beste Weg, dies zu tun, besteht darin, durchzuführen
df.take(1)
und zu überprüfen, ob es null ist. Dies wirdjava.util.NoSuchElementException
so besser zurückkehren, um es zu versuchendf.take(1)
.Der Datenrahmen gibt einen Fehler zurück, wenn
take(1)
er anstelle einer leeren Zeile ausgeführt wird. Ich habe die spezifischen Codezeilen hervorgehoben, in denen der Fehler ausgelöst wird.quelle
count
Methode einige Zeit in Anspruch nehmen.In Scala können Sie Implicits verwenden, um die Methoden
isEmpty()
undnonEmpty()
die DataFrame-API hinzuzufügen, wodurch der Code ein bisschen besser lesbar wird.Hier können auch andere Methoden hinzugefügt werden. Verwenden Sie
import DataFrameExtensions._
in der Datei , in der Sie die erweiterte Funktionalität verwenden möchten, die implizite Konvertierung . Danach können die Methoden direkt wie folgt verwendet werden:quelle
Ich hatte die gleiche Frage und habe 3 Hauptlösungen getestet:
und natürlich funktionieren die 3, jedoch in Bezug auf die Leistung, hier ist, was ich gefunden habe, als ich diese Methoden auf demselben DF in meinem Computer in der Laufzeit der Ausführungszeit ausführte:
Daher denke ich, dass die beste Lösung df.rdd.isEmpty ist, wie @Justin Pihony vorschlägt
quelle
Ich fand das in einigen Fällen:
Dies gilt auch für "Länge" oder ersetzen Sie take () durch head ()
[Lösung] für das Problem, das wir verwenden können.
quelle
Wenn Sie Pypsark verwenden, können Sie auch Folgendes tun:
quelle
Auf PySpark, können Sie auch diese verwenden
bool(df.head(1))
ein erhaltenTrue
vonFalse
WertEs wird zurückgegeben,
False
wenn der Datenrahmen keine Zeilen enthältquelle
Die
take
Methode gibt das Zeilenarray zurück. Wenn also die Arraygröße gleich Null ist, sind keine Datensätze vorhandendf
.quelle
dataframe.limit(1).count > 0
Dies löst auch einen Job aus, aber da wir einen einzelnen Datensatz auswählen, könnte der Zeitverbrauch selbst bei Datensätzen im Milliardenmaßstab viel geringer sein.
Von: https://medium.com/checking-emptiness-in-distributed-objects/count-vs-isempty-surprised-to-see-the-impact-fa70c0246ee0
quelle
Sie können es wie folgt machen:
quelle
schema
von zwei Datenrahmen (sqlContext.emptyDataFrame
&df
) gleich ist, um jemals zurückzukehrentrue
?eq
wird von geerbtAnyRef
und prüft, ob das Argument (das) eine Referenz auf das Empfängerobjekt (das) ist.