Para Spark 2.1.0, mi sugerencia sería usar head(n: Int)
o take(n: Int)
con isEmpty
, el que tenga la intención más clara para ti.
df.head(1).isEmpty
df.take(1).isEmpty
con el equivalente de Python:
len(df.head(1)) == 0 # or bool(df.head(1))
len(df.take(1)) == 0 # or bool(df.take(1))
El uso de df.first()
y df.head()
devolverá el java.util.NoSuchElementException
si el DataFrame está vacío. first()
llama head()
directamente, que llama head(1).head
.
def first(): T = head()
def head(): T = head(1).head
head(1)
devuelve un Array, por lo que asumir head
ese Array hace java.util.NoSuchElementException
que el DataFrame esté vacío.
def head(n: Int): Array[T] = withAction("head", limit(n).queryExecution)(collectFromPlan)
Entonces, en lugar de llamar head()
, use head(1)
directamente para obtener la matriz y luego puede usar isEmpty
.
take(n)
también es equivalente a head(n)
...
def take(n: Int): Array[T] = head(n)
Y limit(1).collect()
es equivalente a head(1)
(aviso limit(n).queryExecution
en el head(n: Int)
método), por lo que los siguientes son todos equivalentes, al menos por lo que puedo decir, y no tendrá que detectar una java.util.NoSuchElementException
excepción cuando el DataFrame esté vacío.
df.head(1).isEmpty
df.take(1).isEmpty
df.limit(1).collect().isEmpty
Sé que esta es una pregunta anterior, así que espero que ayude a alguien que use una versión más nueva de Spark.
df.rdd.isEmpty
?df.head(1)
está tomando una gran cantidad de tiempo, probablemente se deba a que sudf
plan de ejecución está haciendo algo complicado que evita que Spark tome atajos. Por ejemplo, si solo está leyendo archivos de parquetdf = spark.read.parquet(...)
, estoy bastante seguro de que Spark solo leerá una partición de archivo. Pero sidf
está haciendo otras cosas como agregaciones, es posible que, sin darse cuenta, esté obligando a Spark a leer y procesar una gran parte, si no todos, de sus datos de origen.df.limit(1).count()
ingenuamente. En grandes conjuntos de datos, lleva mucho más tiempo que los ejemplos informados por @ hulin003, que son casi instantáneosYo diría que solo tome el subyacente
RDD
. En Scala:en Python:
Dicho esto, todo lo que esto hace es llamar
take(1).length
, por lo que hará lo mismo que respondió Rohan ... ¿quizás un poco más explícito?fuente
Puede aprovechar las funciones
head()
(ofirst()
) para ver siDataFrame
tiene una sola fila. Si es así, no está vacío.fuente
Si lo hace
df.count > 0
. Toma los recuentos de todas las particiones en todos los ejecutores y los suma en Driver. Esto lleva un tiempo cuando se trata de millones de filas.La mejor manera de hacer esto es realizar
df.take(1)
y verificar si es nulo. Esto volverájava.util.NoSuchElementException
así que es mejor intentarlodf.take(1)
.El marco de datos devuelve un error cuando
take(1)
se realiza en lugar de una fila vacía. He resaltado las líneas de código específicas donde arroja el error.fuente
count
método llevará algún tiempo.Desde Spark 2.4.0 existe
Dataset.isEmpty
.Su implementación es:
Tenga en cuenta que a
DataFrame
ya no es una clase en Scala, es solo un alias de tipo (probablemente cambiado con Spark 2.0):fuente
Para los usuarios de Java, puede usar esto en un conjunto de datos:
Esto verifica todos los escenarios posibles (vacío, nulo).
fuente
En Scala, puede usar implícitos para agregar los métodos
isEmpty()
ynonEmpty()
la API de DataFrame, lo que hará que el código sea un poco más agradable de leer.Aquí, también se pueden agregar otros métodos. Para usar la conversión implícita, use
import DataFrameExtensions._
en el archivo que desea usar la funcionalidad extendida. Posteriormente, los métodos se pueden utilizar directamente de la siguiente manera:fuente
Tenía la misma pregunta y probé 3 soluciones principales:
y, por supuesto, los 3 funcionan, sin embargo, en términos de rendimiento, esto es lo que encontré, al ejecutar estos métodos en el mismo DF en mi máquina, en términos de tiempo de ejecución:
por lo tanto, creo que la mejor solución es df.rdd.isEmpty como sugiere @Justin Pihony
fuente
Encontré que en algunos casos:
esto es lo mismo para "longitud" o reemplace take () por head ()
[Solución] para el problema que podemos utilizar.
fuente
Si está utilizando Pypsark, también puede hacer:
fuente
En PySpark, también puede utilizar este
bool(df.head(1))
para obtener unaTrue
deFalse
valorDevuelve
False
si el marco de datos no contiene filasfuente
El
take
método devuelve la matriz de filas, por lo que si el tamaño de la matriz es igual a cero, no hay registros endf
.fuente
dataframe.limit(1).count > 0
Esto también desencadena un trabajo, pero como estamos seleccionando un solo registro, incluso en el caso de miles de millones de registros de escala, el consumo de tiempo podría ser mucho menor.
De: https://medium.com/checking-emptiness-in-distributed-objects/count-vs-isempty-surprised-to-see-the-impact-fa70c0246ee0
fuente
Puedes hacerlo como:
fuente
schema
dos marcos de datos (sqlContext.emptyDataFrame
&df
) sean iguales para volver alguna veztrue
?eq
se heredaAnyRef
y prueba si el argumento (que) es una referencia al objeto receptor (esto).