Pyspark n00b ... Comment remplacer une colonne par une sous-chaîne? J'essaie de supprimer un nombre restreint de caractères du début et de la fin de la chaîne.
from pyspark.sql.functions import substring
import pandas as pd
pdf = pd.DataFrame({'COLUMN_NAME':['_string_','_another string_']})
# this is what i'm looking for...
pdf['COLUMN_NAME_fix']=pdf['COLUMN_NAME'].str[1:-1]
df = sqlContext.createDataFrame(pdf)
# following not working... COLUMN_NAME_fix is blank
df.withColumn('COLUMN_NAME_fix', substring('COLUMN_NAME', 1, -1)).show()
C'est assez proche mais légèrement différent Colonne Spark Dataframe avec le dernier caractère de l'autre colonne . Et puis il y a cette fonction LEFT et RIGHT dans PySpark SQL
pyspark.sql.functions.substring (str, pos, len)
La sous-chaîne commence à pos et est de longueur len lorsque str est de type chaîne ou renvoie la tranche de tableau d'octets qui commence à pos en octet et est de longueur len lorsque str est de type binaire
Dans votre code,
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
Essayez ceci, (avec une syntaxe fixe)
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()
essayer:
df.withColumn('COLUMN_NAME_fix', df['COLUMN_NAME'].substr(1, 10)).show()
où 1 = position de départ dans la chaîne et 10 = nombre de caractères à inclure à partir de la position de départ (inclus)