【问题标题】:Filter rows in Spark dataframe from the words in RDD从 RDD 中的单词中过滤 Spark 数据框中的行
【发布时间】:2016-12-28 07:52:19
【问题描述】:

我在 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 的新手。任何建议都会有所帮助。

【问题讨论】:

  • 如果你可以使用正则表达式,你可以构建一个类似(?s)^(?=.*gon)(?=.*tap)(?=.*wrap) 等的模式(注意这个正则表达式在 Python 和 Java 中的工作方式相同)来要求所有这些词在任何字符串中都存在。
  • @WiktorStribiżew 如果您想提供答案,可以在此处将like 替换为rlike

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


【解决方案1】:

您可以阅读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?
  • 只需使用字符串函数将其构建到 rx 变量中。
  • @WiktorStribizew ,我尝试了您的建议,但出现以下错误: AttributeError: 'function' object has no attribute '_get_object_id' 当我尝试否定过滤器时:DELV_all_cleaned_df2 = DELV_all_cleaned_df.filter(~DELV_all_cleaned_df ['DELIV_LOC_DESC'].rlike(expr)).. 没有 ~ 的那个有效
猜你喜欢
  • 2019-03-07
  • 2015-06-27
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 2016-12-08
相关资源
最近更新 更多