我在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
等字词,并且三列数据中的任何一行包含bygone
,gone
等值,我想过滤掉那一排。
我尝试过以下方法:
data.filter(~data['column1'].like('%gon%') | data['column2'].like('%gon%') | data['column3'].like('%gon%')).toPandas()
这适用于一个词。但我想检查words.txt
中的所有单词并将其删除。有没有办法做到这一点?
我是PySpark的新手。任何建议都会有所帮助。
答案 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
但基于正则表达式执行搜索。