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 unColumn
objeto. Primero tenemos que convertir ese número en unColumn
.
Te invitamos a añadir valor a nuestro contenido asistiendo con tu veteranía en las observaciones.