En este momento, tengo que usar df.count > 0para verificar si DataFrameestá vacío o no. Pero es algo ineficiente. ¿Hay alguna forma mejor de hacerlo?
Gracias.
PD: quiero verificar si está vacío para que solo guarde el DataFramesi no está vacío
En este momento, tengo que usar df.count > 0para verificar si DataFrameestá vacío o no. Pero es algo ineficiente. ¿Hay alguna forma mejor de hacerlo?
Gracias.
PD: quiero verificar si está vacío para que solo guarde el DataFramesi no está vacío
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.NoSuchElementExceptionsi 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 headese Array hace java.util.NoSuchElementExceptionque 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).queryExecutionen 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.NoSuchElementExceptionexcepció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 sudfplan 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 sidfestá 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 siDataFrametiene 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.NoSuchElementExceptionasí 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
countmétodo llevará algún tiempo.Desde Spark 2.4.0 existe
Dataset.isEmpty.Su implementación es:
Tenga en cuenta que a
DataFrameya 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 unaTruedeFalsevalorDevuelve
Falsesi el marco de datos no contiene filasfuente
El
takemé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 > 0Esto 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
schemados marcos de datos (sqlContext.emptyDataFrame&df) sean iguales para volver alguna veztrue?eqse heredaAnyRefy prueba si el argumento (que) es una referencia al objeto receptor (esto).