首页 文章

Pyspark用子串改变列

提问于
浏览
1

Pyspark n00b ...如何用自身的子串替换列?我正在尝试从字符串的开头和结尾删除选定数量的字符 .

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 回答

  • 4

    pyspark.sql.functions.substring(str,pos,len)子串从pos开始,当str是String类型时长度为len,或者返回以字节为单位以字节开头的字节数组的片段,当str为str时,长度为len二进制类型

    在你的代码中,

    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

    尝试:

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

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

相关问题