从 RDD 中的单词过滤 Spark 数据帧中的行

hai*_*men 5 python regex apache-spark pyspark spark-dataframe

我在火花中有以下命令,

data = sqlContext.sql("select column1, column2, column3 from table_name")

words = sc.textFile("words.txt")
Run Code Online (Sandbox Code Playgroud)

words.txt有一堆单词,数据有三个取自table_name.

现在,每当每个单词的单词模式words.txt出现在三列数据中的任何一列时,我都想过滤掉数据中的行(火花数据帧)。

例如,如果words.txt有字,如gon,如果任何数据的三列包含值bygonegone等等,我想筛选出该行。

我尝试了以下方法:

data.filter(~data['column1'].like('%gon%') | data['column2'].like('%gon%') | data['column3'].like('%gon%')).toPandas()
Run Code Online (Sandbox Code Playgroud)

这适用于一个词。但我想检查 中的所有单词words.txt并将其删除。有没有办法做到这一点?

我是 PySpark 的新手。任何的意见都将会有帮助。

Wik*_*żew 4

您可以阅读 中的单词words.txt,并构建一个正则表达式模式,如下所示:

(?s)^(?=.*word1)(?=.*word2)(?=.*word3)
Run Code Online (Sandbox Code Playgroud)

等等,其中(?s)允许.匹配任何符号,^匹配字符串起始位置,然后每次(?=...)向前查找都需要字符串中每个单词的存在。

因此,如果将正则表达式放入 var 中rx,它将如下所示:

data.filter(~data['column1'].rlike(rx) | data['column2'].rlike(rx) | data['column3'].rlike(rx)).toPandas()
Run Code Online (Sandbox Code Playgroud)

其中正则表达式模式传递给与正则表达式rlike类似like但基于正则表达式执行搜索的方法。