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

时间:2016-08-21 19:26:29

标签: python regex apache-spark pyspark spark-dataframe

我在spark中有以下命令,

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

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

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

现在,我希望在三列数据中的任何一列中出现来自words.txt的每个单词的单词模式时,过滤掉数据中的行(spark数据帧)。

例如,如果words.txt包含gon等字词,并且三列数据中的任何一行包含bygonegone等值,我想过滤掉那一排。

我尝试过以下方法:

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

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

我是PySpark的新手。任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:4)

您可以阅读words.txt中的字词,并构建一个这样的正则表达式:

(?s)^(?=.*word1)(?=.*word2)(?=.*word3)

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

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

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

将正则表达式模式传递给rlike方法,该方法类似于like但基于正则表达式执行搜索。