Saltar al contenido

Pyspark alter columna con subcadena

Hacemos una revisión exhaustiva cada una de las noticias en nuestra web con la meta de enseñarte en todo momento información con la mayor veracidad y certera.

Solución:

pyspark.sql.functions.substring(str, pos, len)

La subcadena comienza en pos y tiene una longitud de len cuando str es de tipo Cadena o devuelve la porción de byte array que comienza en pos en byte y tiene una longitud len cuando str es de tipo binario

En tu código,

df.withColumn('COLUMN_NAME_fix', substring('COLUMN_NAME', 1, -1))
1 is pos and -1 becomes len, length can't be -1 and so it returns null

Prueba esto, (con sintaxis fija)

from pyspark.sql.types import StringType
from pyspark.sql.functions import udf

udf1 = udf(lambda x:x[1:-1],StringType())
df.withColumn('COLUMN_NAME_fix',udf1('COLUMN_NAME')).show()

probar:

df.withColumn('COLUMN_NAME_fix', df['COLUMN_NAME'].substr(1, 10)).show()

donde 1 = posición inicial en el string y 10 = número de caracteres a incluir desde la posición inicial (inclusive)

La respuesta aceptada utiliza un udf (función definida por el usuario), que suele ser (mucho) más lenta que el código Spark nativo. La respuesta de Grant Shannon usa un código de chispa nativo, pero como se indica en los comentarios de citynorman, no está 100% claro cómo funciona esto para la variable string longitudes

Respuesta con código de chispa nativo (sin udf) y variable string longitud

De la documentación de substr en pyspark, podemos ver que los argumentos: startPos y length pueden ser int o Column tipos (ambos deben ser del mismo tipo). Entonces solo necesitamos crear una columna que contenga el string longitud y usar eso como argumento.

import pyspark.sql.functions as sf

result = (
    df
    .withColumn('length', sf.length('COLUMN_NAME'))
    .withColumn('fixed_in_spark', col('COLUMN_NAME').substr(sf.lit(2), col('length') - sf.lit(2)))
)

# result:
+----------------+---------------+----+--------------+
|     COLUMN_NAME|COLUMN_NAME_fix|size|fixed_in_spark|
+----------------+---------------+----+--------------+
|        _string_|         string|   8|        string|
|_another string_| another string|  16|another string|
+----------------+---------------+----+--------------+

Nota:

  • Usamos longitud – 2 porque comenzamos desde el segundo carácter (y necesitamos todo hasta el penúltimo).
  • necesitamos usar sf.lit porque no podemos sumar (o restar) un número a un Column objeto. Primero tenemos que convertir ese número en un Column.

Te invitamos a añadir valor a nuestro contenido asistiendo con tu veteranía en las observaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *