Python 如何有效地检查Spark数据帧中是否包含单词列表?
使用PySpark数据帧,我试图尽可能高效地完成以下工作。我有一个数据框,其中有一列包含文本和一个要按其筛选行的单词列表。因此: Dataframe看起来像这样Python 如何有效地检查Spark数据帧中是否包含单词列表?,python,apache-spark,dataframe,pyspark,Python,Apache Spark,Dataframe,Pyspark,使用PySpark数据帧,我试图尽可能高效地完成以下工作。我有一个数据框,其中有一列包含文本和一个要按其筛选行的单词列表。因此: Dataframe看起来像这样 df: col1 col2 col_with_text a b foo is tasty 12 34 blah blahhh yeh 0 bar of yums 列表将是list=[foo,bar] 因此,结果将是: result: col1 col2 co
df:
col1 col2 col_with_text
a b foo is tasty
12 34 blah blahhh
yeh 0 bar of yums
列表将是list=[foo,bar]
因此,结果将是:
result:
col1 col2 col_with_text
a b foo
yeh 0 bar
之后,不仅要进行相同的字符串匹配,还要使用SequenceMatcher等工具进行相似性测试。这是我已经尝试过的:
def check_keywords(x):
words_list = ['foo','bar']
for word in x
if word == words_list[0] or word == words_list[1]:
return x
result = df.map(lambda x: check_keywords(x)).collect()
不幸的是我失败了,有人能帮我吗?
谢谢。 你应该考虑使用PySpice SQL模块函数,而不是编写<代码> UDF,有几个<代码> ReGEXP < /C>函数: 首先,让我们从一个更完整的示例数据帧开始:
df=sc.parallelize([“a”、“b”、“foo很好吃”]、[“12”、“34”、“诸如此类”]、[“yeh”、“0”、“yums吧”],
['haha','1','foobar none'],['hehe','2','something bar other'])\
.toDF([“col1”、“col2”、“col_与_text”])
如果要根据是否包含words\u列表
中的一个单词来筛选行,可以使用rlike
:
import pyspark.sql.函数作为psf
单词列表=['foo','bar']
df.filter(psf.col('col|u with_text').rlike('(^ |\s)('+'|').join(words|list)+'(\s |$)).show()
+----+----+------------------+
|col1 | col2 | col|u带| u文本|
+----+----+------------------+
|阿福很好吃|
|yums的yeh | 0 | bar|
|呵呵| 2 |点别的吧|
+----+----+------------------+
如果要提取与正则表达式匹配的字符串,可以使用regexp\u extract
:
df.withColumn(
“提取的单词”,
psf.regexp_extract('col_with_text','(?=^|\s)('+'|'.join(words|list)+')(?=\s|$)',0))\
.show()
+----+----+------------------+--------------+
|col1 | col2 | col|u带|文本|提取|单词|
+----+----+------------------+--------------+
|阿福很好吃|
|12 | 34 |诸如此类|
|yeh | 0 | yums酒吧|酒吧|
|哈哈| 1 | foobar none ||
|呵呵| 2 |除了别的什么||
+----+----+------------------+--------------+
我已经试过了,如果你改变单词列表
words\u list=['foo','is','bar']
结果保持不变,没有显示其他单词
+----+----+------------------+--------------+
|col1 | col2 | col|u带|文本|提取|单词|
+----+----+------------------+--------------+
|阿福很好吃|
|12 | 34 |诸如此类|
|yeh | 0 | yums酒吧|酒吧|
|哈哈| 1 | foobar none ||
|呵呵| 2 |除了别的什么||
+----+----+------------------+--------------+
Hi可能重复,为什么在regexp中使用lookaheads?