web-dev-qa-db-ja.com

Pysparkは部分文字列で列を変更します

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列 。そして、これがあります PySpark SQLのLEFTおよびRIGHT関数

6
citynorman

pyspark.sql.functions.substring(str、pos、len)

部分文字列は、posで始まり、strがString型の場合は長さlenであるか、posで始まり、strがBinary型の場合は長さ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()
13
Suresh

試してください:

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

1 =文字列の開始位置、10 =開始位置からの文字数(両端を含む)

3
Grant Shannon