如何使用PySpark的RegexTokenizer从字符串中删除数字?

时间:2019-02-13 01:19:57

标签: python apache-spark pyspark

我想使用PySpark的RegexTokenizer从DataFrame列中删除5位或更多位数字。我可以使用以下代码提取这些数字,但是有人知道我可以删除它们吗?

我的代码:

regexTokenizer = RegexTokenizer(inputCol="description", outputCol="tokenized_description", gaps=False,pattern="[0-9]{5,}")

如果字符串是“ 123abc 122323232”,我希望它删除122323232并变成“ 123abc”

1 个答案:

答案 0 :(得分:0)

RegexTokenizer使用正则表达式模式作为分隔符,将字符串分成多个令牌。

通过在转换后的列上应用pyspark.sql.functions.array_join函数,可以在此事实之后将单词连接到数组中。

from pyspark.ml.feature import RegexTokenizer
from pyspark.sql.functions import array_join
from pyspark.sql import SparkSession

spark = SparkSession\
            .builder\
            .appName("Pattern Replacement Example")\
            .getOrCreate()
df = spark.createDataFrame([('123abc 122323232',)],['pattern'])
regexTokenizer = RegexTokenizer(inputCol="pattern", outputCol="words", pattern="[0-9]{5,}")
df_words = regexTokenizer.transform(df)

df_pattern_removed = df_words.select(array_join("words", '').alias("pattern_removed"), "pattern", "words").show(truncate=False)

print(df_pattern_removed.show(truncate=False))

我建议尽可能使用Spark SQL,尤其是pyspark.sql.functions.regexp_replace函数。

from pyspark.sql.functions import regexp_replace
from pyspark.sql import SparkSession

spark = SparkSession\
            .builder\
            .appName("Pattern Replacement Example")\
            .getOrCreate()
df = spark.createDataFrame([('123abc 122323232',)],['pattern'])

df_pattern_removed = df.select(
    regexp_replace('pattern', r'[0-9]{5,}', '').alias('pattern_replaced'), 
    "pattern"
)

print(df_pattern_removed.show(truncate=False))

请注意,这匹配的字符串包含0-9到三次a-z到三次的字符串。