Scala/Spark: ¿Busca elementos nulos en una columna de matriz pero IntelliJ sugiere no usar nulos?

CorePress2024-01-24  9

Tengo una columna llamada ResponseTimes que es de tipo matriz:

ArrayType(IntegerType,true)

Estoy intentando agregar otra columna para contar el número de valores nulos o no establecidos en esta matriz:

val contains_null = udf((xs: Seq[Integer]) => xs.contains(null))
df.withColumn("totalNulls", when(contains_null(col("responseTimes")),
    lit(1)).otherwise(0))

Aunque esto me da el resultado correcto, IntelliJ sigue diciéndome que evite el uso de nulo en mi UDF, lo que me hace pensar que esto es malo. ¿Hay alguna otra forma de hacerlo? Además, ¿es posible sin utilizar UDF?

He hecho exactamente lo que se menciona en el enlace anterior. Estoy buscando una alternativa para evitar el uso de funciones "nulas". en la UDF

- usuario10751899

27 de marzo de 2021 a las 0:23



------------------------------------

La razón es muy simple, se debe a las reglas de spark udf, bueno, spark trata con null de una manera distribuida diferente, no sé si conoces la función incorporada array_contains en spark sql.

Si se necesitan UDF, siga estas reglas:

El código Scala debe manejar los valores nulos con elegancia y no debería generar errores si hay valores nulos.

El código Scala debe devolver Ninguno (o nulo) para valores desconocidos, faltantes o irrelevantes. Los DataFrames también deben usar null for para valores desconocidos, faltantes o irrelevantes.

Usar opción en Scódigo cala y recurrir a nulo si la opción se convierte en un cuello de botella de rendimiento.

Consulte este enlace si desea leer más: https://mungingdata.com/apache-spark/dealing-with-null/

5

La función array_contains no puede aceptar un valor NULL. Recibo el error "no se puede resolver 'array_contains(responseTimes, NULL)' debido a una discrepancia en el tipo de datos: los valores escritos nulos no se pueden usar como argumentos;;)

- usuario10751899

27 de marzo de 2021 a las 0:21

Array_contains toma una columna y un valor como parámetros

- itIsNaz

27 de marzo de 2021 a las 0:46

Correcto. ¿Puedes agregar cómo puedo usar array_contains para verificar si contiene valores nulos?

- usuario10751899

27 de marzo de 2021 a las 5:10

array_contains no funcionará para valores nulos ya que no se puede verificar la igualdad nula

- obispo negro

27 de marzo de 2021 a las 9:36

Puedes adaptar tu Udf usando contiene con opciones consultando el segundo punto de las reglas de udf (usa Ninguno e hijo en)

- itIsNaz

27/03/2021 a las 10:04



------------------------------------

Puedes reescribir tu UDF para usar la opción. En Scala, la opción (nula) da Ninguno, por lo que puedes hacer:

val contains_null = udf((xs: Seq[Integer]) => xs.exists(e => Option(e).isEmpty))

Sin embargo, si está utilizando Spark 2.4+, es más adecuado utilizar las funciones integradas de Spark para esto. Para verificar si una columna de matriz contiene elementos nulos, use existe como lo sugiere la respuesta de @mck.

Si desea obtener el recuento de valores nulos en la matriz, puede combinar la función de filtro y tamaño:

df.withColumn("totalNulls", size(expr("filter(responseTimes, x -> x is null)")))



------------------------------------

Probablemente una mejor manera sea utilizar la función de orden superior que existe para comprobar si es nulo para cada elemento de la matriz:

// sample dataframe
val df = spark.sql("select array(1,null,2) responseTimes union all select array(3,4)")

df.show
+-------------+
|responseTimes|
+-------------+
|      [1,, 2]|
|       [3, 4]|
+-------------+

// check whether there exists null elements in the array
val df2 = df.withColumn("totalNulls", expr("int(exists(responseTimes, x -> isnull(x)))"))

df2.show
+-------------+----------+
|responseTimes|totalNulls|
+-------------+----------+
|      [1,, 2]|         1|
|       [3, 4]|         0|
+-------------+----------+

También puedes usar array_max junto con transform:

val df2 = df.withColumn("totalNulls", expr("int(array_max(transform(responseTimes, x -> isnull(x))))"))

df2.show
+-------------+----------+
|responseTimes|totalNulls|
+-------------+----------+
|      [1,, 2]|         1|
|       [3, 4]|         0|
+-------------+----------+

0

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare