2017-10-14 135 views
-1

Pyspark n00b ...我如何用自己的子字符串替换列?我试图从字符串的开头和结尾删除选定数量的字符。Pyspark alter column with substring

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

这是非常接近,但略有不同Spark Dataframe column with last character of other column。再有就是这个 LEFT and RIGHT function in PySpark SQL

回答

2

pyspark.sql.functions.substring(STR,POS,LEN)

子串开始于POS和是长度LEN的时str是字符串类型或返回的切片字节数组开始于在字节POS和是长度LEN的时str是二元型

在代码中,

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 

尝试此,(具有固定的语法)

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() 
+0

伟大的作品谢谢! – citynorman

-1

尝试:

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

其中1 =字符串中开始位置和 10 =字符数从开始位置包括(含)

+1

如果长度是动态的呢? – citynorman

+0

使用:_df ['COLUMN_NAME']。substr(startPos,strLength)_其中_startPos_是变量的起始位置,_strLength_是要包含的字符数的可变长度 – gps

+1

是的,如果'strLength'在样本之间变化,我上面的例子 – citynorman

相关问题