web-dev-qa-db-fra.com

Pyspark alter colonne avec sous-chaîne

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

2
citynorman

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()
6
Suresh

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) 

0
Grant Shannon