La clase pyspark.sql.DataFrameNaFunctions en PySpark tiene muchos métodos para manejar valores NULL/Ninguno, uno de los cuales es la función drop(), que se usa para eliminar/eliminar filas que contienen valores NULL en columnas DataFrame. También puede usar df.dropna(), como se muestra en este artículo. Puede soltar todas las filas en cualquiera, todas, columnas únicas, múltiples y elegidas usando el método drop(). Cuando necesite desinfectar los datos antes de procesarlos, esta función es bastante útil. Cualquier columna con un valor vacío al leer un archivo en la API de PySpark DataFrame devuelve NULL en el DataFrame. Para eliminar filas en RDBMS SQL, debe verificar cada columna en busca de valores nulos, pero el método PySpark drop() es más poderoso ya que examina todas las columnas en busca de valores nulos y elimina las filas.
PySpark drop() Sintaxis
El método drop() en PySpark tiene tres argumentos opcionales que se pueden usar para eliminar valores NULL de una sola, cualquiera, todas o varias columnas de DataFrame. Debido a que drop() es un método de transformación, produce un nuevo marco de datos después de eliminar filas/registros del marco de datos actual.
drop(how='any', thresh=None, subset=None)
Todos estos ajustes son opcionales.
- how – Esto acepta cualquiera o todos los valores. Suelte una fila si incluye valores NULL en cualquier columna mediante el operador ‘cualquiera’. Suelte una fila solo si todas las columnas contienen valores NULOS si usa la opción ‘todos’. El valor predeterminado es ‘cualquiera’.
- trillar: esta es una cantidad int; las filas con valores no nulos menores que el umbral se eliminan. ‘Ninguno’ es el valor predeterminado.
- subconjunto: se utiliza para seleccionar las columnas que contienen valores NULL. ‘Ninguno’ es el valor predeterminado.
Implementación
Antes de comenzar, leamos un archivo CSV en un DataFrame. PySpark asigna valores nulos a columnas vacías de strings y enteros cuando no hay valores en esas filas.
CSV utilizado:
Python3
import pyspark.sql.functions as sqlf from pyspark.sql import SparkSession import findspark findspark.init() spark: SparkSession = SparkSession.builder \ .master("local[1]") \ .appName("SparkByExamples.com") \ .getOrCreate() filePath = "example1.csv" df = spark.read.options(header='true', inferSchema='true') \ .csv(filePath) df.printSchema() df.show(truncate=False)
Esto da como resultado el resultado que se muestra a continuación, el nombre y la ciudad tienen valores nulos, como puede ver.
Soltar columnas con valores NULL
Python3
def dropNullColumns(df): """ This function drops columns containing all null values. :param df: A PySpark DataFrame """ null_counts = df.select([sqlf.count(sqlf.when(sqlf.col(c).isNull(), c)).alias( c) for c in df.columns]).collect()[0].asDict() # 1 col_to_drop = [k for k, v in null_counts.items() if v > 0] # 2 df = df.drop(*col_to_drop) # 3 return df
Estamos usando el método de selección de pyspark en la primera línea, que proyecta un grupo de expresiones y devuelve un nuevo marco de datos. Se evaluará la colección de expresiones incluidas entre paréntesis y, como resultado, se creará un nuevo marco de datos. La expresión cuenta la cantidad de valores nulos en cada columna y luego puede usar el método de recopilación para recuperar los datos del marco de datos y crear un dict con los nombres de las columnas y la cantidad de valores nulos en cada una.
Solo estamos filtrando columnas con valores nulos mayores que 0 en la segunda línea, lo que básicamente significa cualquier columna con valores nulos.
Después de averiguar las columnas que contenían valores nulos, usamos la función de soltar en la tercera línea y finalmente devolvimos el marco de datos.
Ejemplo:
CSV utilizado:
Python3
import pyspark.sql.functions as sqlf from pyspark.sql import SparkSession import findspark findspark.init() spark: SparkSession = SparkSession.builder \ .master("local[1]") \ .appName("SparkByExamples.com") \ .getOrCreate() filePath = "/content/swimming_pool.csv" df = spark.read.options(header='true', inferSchema='true') \ .csv(filePath) df.printSchema() df.show(truncate=False)
Después de usar la función dropNullColumns –