从RDD中的单词过滤Spark dataframe中的行

5

我在Spark中有以下命令:

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

words = sc.textFile("words.txt")

words.txt包含许多单词,数据有三个字符串列取自table_name

现在我想要过滤掉数据(spark dataframe)中每个单词的单词模式出现在任何三列数据中的行。

例如,如果words.txt中有单词gon,并且数据的任何三列包含值如bygonegone等,我希望过滤掉该行。

我已经尝试了以下方法:

data.filter(~data['column1'].like('%gon%') | data['column2'].like('%gon%') | data['column3'].like('%gon%')).toPandas()

这适用于一个单词。但我想检查 words.txt 中的所有单词并将其删除。有没有方法可以做到这一点?
我对 PySpark 很陌生。任何建议都将很有帮助。

1
如果您可以使用正则表达式,您可以构建一个模式,例如 (?s)^(?=.*gon)(?=.*tap)(?=.*wrap) 等等(请注意,此正则表达式在Python和Java中的工作方式相同),以要求任何字符串中都存在这些单词。 - Wiktor Stribiżew
1
@WiktorStribiżew 如果你想提供一个答案,你可以在这里用 rlike 替换 like - zero323
1个回答

4
您可以从words.txt中阅读单词,并构建以下正则表达式模式:
(?s)^(?=.*word1)(?=.*word2)(?=.*word3)

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

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

data.filter(~data['column1'].rlike(rx) | data['column2'].rlike(rx) | data['column3'].rlike(rx)).toPandas()

在这里,正则表达式模式被传递给rlike方法,该方法类似于like但是基于正则表达式进行搜索。


我们在这里如何传递word1和word2? - haimen
只需使用字符串函数构建一个 rx 变量即可。 - Wiktor Stribiżew
{btsdaf} - E B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接