python - 字符串中的 Pyspark 双字符替换避免某些单词而不映射到 pandas 或 rdd
问题描述
我继承了一个程序,它修改了 pyspark 数据框中的一些字符串。其中一个步骤涉及从字符串中的某些单词中删除双/三/等字母,并附加一个例外列表,即使它们有重复的字母,也会被单独留下。目前,这是通过使用 udf 将数据帧转换为 pandas 来完成的,然后将自定义函数应用于生成的 pandas 数据帧中的字符串,然后再读回 pyspark。不幸的是,对要求的更改意味着代码在任何情况下都不能使用 pandas udf 或映射到 rdd。我需要直接在 pyspark 中执行相同的功能。
连续字符删除函数逐字读取字符串,检查该单词是否在异常列表中,如果不在,则逐字符移动,将其与前一个字符进行比较,如果匹配,则检查是否创建了一个新词,逐个字符,省略重复。
下面是当前实现的 MWE,在 pyspark 数据帧转换为 pandas 之后。
import pandas as pd
exception_list = ['ACCOUNTING', 'LOOK', 'FOOOOO']
cols = ['input']
data = [
["BOOK TOOK LOOK HOUSE SHOOK"],
["ACCOUNTING SHEEP"],
["FOO FOOO FOOOO FOOOOO FOOOOOO"]
]
df = pd.DataFrame(data, columns=cols)
df.head()
def drop_consecutive_chars(phrase, exception):
if phrase == '':
return phrase
else:
new_phrase = []
for word in phrase.split():
if word not in exception:
prev = word[0]
new_word = prev
for char in word[1:]:
if char != prev:
new_word += char
prev = char
else:
new_word = word
new_phrase += [new_word]
new_phrase = ' '.join(new_phrase)
return new_phrase
df['output'] = df['input'].apply(drop_consecutive_chars,
exception=exception_list)
df.head()
有什么方法可以在 pyspark 中做到这一点?我愿意使用 RegexTokenizer 之类的东西并稍后将其加入,以及创建额外的真值列,这些列随后会被删除。它只需要在数据框离开 pyspark 或映射到其他任何东西的情况下完成。
解决方案
与我之前的回答类似,您可以使用高阶函数来表示 Python 代码的逻辑:
import pyspark.sql.functions as F
df2 = sdf.withColumn(
'exception_list',
F.array(*[F.lit(w) for w in exception_list])
).withColumn(
'output',
F.expr("""
concat_ws(' ',
transform(
split(input, ' '),
w -> case when array_contains(exception_list, w)
then w
else concat_ws('',
transform(
split(w, ''),
(c, i) -> case when i = 0 or c != split(w, '')[i-1]
then c
else ''
end
)
)
end
)
)
""")
).drop('exception_list')
df2.show(truncate=False)
+-----------------------------+-----------------------+
|input |output |
+-----------------------------+-----------------------+
|BOOK TOOK LOOK HOUSE SHOOK |BOK TOK LOOK HOUSE SHOK|
|ACCOUNTING SHEEP |ACCOUNTING SHEP |
|FOO FOOO FOOOO FOOOOO FOOOOOO|FO FO FO FOOOOO FO |
+-----------------------------+-----------------------+
推荐阅读
- javascript - Object.keys 行为异常
- mysql - 为 sql 语句生成 sql 模板的任何实用程序
- c# - 发送键 {ENTER} 到特定的 Windows 弹出窗口
- youtube - 使用 commentThreads.list 端点检索 Youtube v3 API 评论
- angular - Angular Material Mat-Card Interpolation 添加 html 格式的字符串错误
- java - 用于验证字符串的正则表达式,日期格式 YYYYMMDD,不带分隔符 + 5 个免费数字
- unity3d - 从对撞机访问游戏对象属性
- r - 如何将向量或列切割成R中的间隔
- flutter - 添加 Pushe 插件时找不到符号 @NonNull
- windows-installer - 当安装 gui 要求提供凭据并更新现有的凭据时,我可以静默安装 setup.exe 或 msi 文件吗?