我在 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 的新手。任何建议都会有所帮助。
最佳答案
您可以从 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
但基于正则表达式执行搜索。
关于python - 从 RDD 中的单词过滤 Spark 数据框中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39068065/