Python 如何有效地检查Spark数据帧中是否包含单词列表?

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

使用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   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?