Pour Spark 2.1.0, ma suggestion serait d'utiliser head(n: Int)
ou take(n: Int)
avec isEmpty
, celui qui a l'intention la plus claire pour vous.
df.head(1).isEmpty
df.take(1).isEmpty
avec l'équivalent Python:
len(df.head(1)) == 0 # or bool(df.head(1))
len(df.take(1)) == 0 # or bool(df.take(1))
Utiliser df.first()
et df.head()
renverra tous les deux le java.util.NoSuchElementException
si le DataFrame est vide. first()
appelle head()
directement, qui appelle head(1).head
.
def first(): T = head()
def head(): T = head(1).head
head(1)
renvoie un Array, donc prendre head
cet Array provoque le java.util.NoSuchElementException
lorsque le DataFrame est vide.
def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)
Donc, au lieu d'appeler head()
, utilisez head(1)
directement pour obtenir le tableau et vous pouvez ensuite utiliser isEmpty
.
take(n)
équivaut également à head(n)
...
def take(n: Int): Array[T] = head(n)
Et limit(1).collect()
est équivalent à head(1)
(remarquez limit(n).queryExecution
dans la head(n: Int)
méthode), donc les éléments suivants sont tous équivalents, du moins d'après ce que je peux dire, et vous n'aurez pas à attraper une java.util.NoSuchElementException
exception lorsque le DataFrame est vide.
df.head(1).isEmpty
df.take(1).isEmpty
df.limit(1).collect().isEmpty
Je sais que c'est une question plus ancienne, donc j'espère qu'elle aidera quelqu'un à utiliser une version plus récente de Spark.
df.rdd.isEmpty
?df.head(1)
prend beaucoup de temps, c'est probablement parce que votredf
plan d'exécution fait quelque chose de compliqué qui empêche Spark de prendre des raccourcis. Par exemple, si vous lisez simplement des fichiers parquetdf = spark.read.parquet(...)
, je suis presque sûr que Spark ne lira qu'une seule partition de fichiers. Mais si vousdf
faites d'autres choses comme des agrégations, vous pouvez forcer par inadvertance Spark à lire et à traiter une grande partie, sinon la totalité, de vos données sources.df.limit(1).count()
naïvement. Sur les grands ensembles de données, cela prend beaucoup plus de temps que les exemples rapportés par @ hulin003 qui sont presque instantanésJe dirais simplement de saisir le sous-jacent
RDD
. Dans Scala:en Python:
Cela étant dit, tout cela ne fait qu'appeler
take(1).length
, donc ça fera la même chose que Rohan a répondu ... juste peut-être un peu plus explicite?la source
Vous pouvez profiter des fonctions
head()
(oufirst()
) pour voir si leDataFrame
a une seule ligne. Si c'est le cas, il n'est pas vide.la source
Si vous le faites
df.count > 0
. Il prend le décompte de toutes les partitions sur tous les exécuteurs et les additionne dans Driver. Cela prend un certain temps lorsque vous traitez des millions de lignes.La meilleure façon de faire est d'effectuer
df.take(1)
et de vérifier si sa valeur null. Cela reviendrajava.util.NoSuchElementException
tellement mieux de faire un essaidf.take(1)
.Le dataframe renvoie une erreur quand
take(1)
est terminé au lieu d'une ligne vide. J'ai mis en évidence les lignes de code spécifiques où cela génère l'erreur.la source
count
méthode prendra un certain temps.Depuis Spark 2.4.0, il existe
Dataset.isEmpty
.Sa mise en œuvre est:
Notez que a
DataFrame
n'est plus une classe dans Scala, c'est juste un alias de type (probablement changé avec Spark 2.0):la source
Pour les utilisateurs Java, vous pouvez l'utiliser sur un ensemble de données:
Cela vérifie tous les scénarios possibles (vide, nul).
la source
Dans Scala, vous pouvez utiliser des implicits pour ajouter les méthodes
isEmpty()
etnonEmpty()
à l'API DataFrame, ce qui rendra le code un peu plus agréable à lire.Ici, d'autres méthodes peuvent également être ajoutées. Pour utiliser la conversion implicite, utilisez
import DataFrameExtensions._
dans le fichier que vous souhaitez utiliser la fonctionnalité étendue. Ensuite, les méthodes peuvent être utilisées directement comme suit:la source
J'avais la même question, et j'ai testé 3 solutions principales:
et bien sûr les 3 fonctionnent, cependant en terme de performance, voici ce que j'ai trouvé, en exécutant ces méthodes sur le même DF dans ma machine, en terme de temps d'exécution:
donc je pense que la meilleure solution est df.rdd.isEmpty comme le suggère @Justin Pihony
la source
J'ai trouvé cela sur certains cas:
c'est la même chose pour "length" ou remplacez take () par head ()
[Solution] pour le problème que nous pouvons utiliser.
la source
Si vous utilisez Pypsark, vous pouvez également faire:
la source
Sur PySpark, vous pouvez également utiliser
bool(df.head(1))
pour obtenir uneTrue
deFalse
valeurIl renvoie
False
si le dataframe ne contient aucune lignela source
La
take
méthode renvoie le tableau de lignes, donc si la taille du tableau est égale à zéro, il n'y a aucun enregistrement dansdf
.la source
dataframe.limit(1).count > 0
Cela déclenche également un travail, mais comme nous sélectionnons un enregistrement unique, même dans le cas d'un milliard d'enregistrements à l'échelle, la consommation de temps pourrait être beaucoup plus faible.
De: https://medium.com/checking-emptiness-in-distributed-objects/count-vs-isempty-surprised-to-see-the-impact-fa70c0246ee0
la source
Vous pouvez le faire comme:
la source
schema
deux dataframes (sqlContext.emptyDataFrame
&df
) soient identiques pour pouvoir revenirtrue
?eq
est hérité deAnyRef
et teste si l'argument (that) est une référence à l'objet récepteur (this).