我想在数据帧的一列中进行多重拆分。 例:
s = "Cras mattis MP the -69661/69662;69663 /IS4567"
如何获得:
s = ['Cras', 'mattis', 'MP', 'the', '69661', '69662', '69663', 'IS4567' ]
谢谢
使用 SparkSQL 的内置函数 sentences(( 和 flatten(( 的一种方式 [需要 spark 2.4.0+ forflatten((]:
from pyspark.sql.functions import expr
df.withColumn('new_s', expr('flatten(sentences(s))')).show(truncate=False)
#+---------------------------------------------+----------------------------------------------------+
#|s |new_s |
#+---------------------------------------------+----------------------------------------------------+
#|Cras mattis MP the -69661/69662;69663 /IS4567|[Cras, mattis, MP, the, 69661, 69662, 69663, IS4567]|
#+---------------------------------------------+----------------------------------------------------+
句子((从Apache Hive文档中做了什么:
将自然语言文本字符串标记为单词和句子,其中每个句子在适当的句子边界处中断,并作为单词数组返回。"lang"和"locale"是可选参数。例如,句子('你好!你好吗?返回 ( ("你好", "那里"(, ("如何", "是", "你"( (。
您可以使用采用正则表达式模式拆分数据的拆分函数。
import pyspark.sql.functions as f
df.withColumn('ns', f.split('s', "[^a-zA-Z0-9']+")).show(10,False)
+---------------------------------------------+----------------------------------------------------+
|s |ns |
+---------------------------------------------+----------------------------------------------------+
|Cras mattis MP the -69661/69662;69663 /IS4567|[Cras, mattis, MP, the, 69661, 69662, 69663, IS4567]|
+---------------------------------------------+----------------------------------------------------+
注意:"[^a-zA-Z0-9']+"
将处理基本的英文字符 但是如果要包含特殊字符,则可以使用泛型p{L}
而不是a-zA-Z
"喜欢""[^\p{L}0-9']+"