有没有办法使用scala过滤不包含spark数据框中某些内容的字段?

Posted

技术标签:

【中文标题】有没有办法使用scala过滤不包含spark数据框中某些内容的字段?【英文标题】:Is there a way to filter a field not containing something in a spark dataframe using scala? 【发布时间】:2015-11-09 11:53:59 【问题描述】:

希望我很愚蠢,这很容易。

我有一个包含“url”和“referrer”列的数据框。

我想提取所有包含***域“www.mydomain.com”和“mydomain.co”的引荐来源网址。

我可以使用

val filteredDf = unfilteredDf.filter(($"referrer").contains("www.mydomain."))

但是,由于某种原因,这会提取出包含我的网络域的网址 www.google.co.uk 搜索网址。有没有一种方法,在 spark 中使用 scala,我可以过滤掉任何带有 google 的东西,同时保持正确的结果?

谢谢

院长

【问题讨论】:

【参考方案1】:

您可以使用not! 来否定谓词,因此剩下的就是添加另一个条件:

import org.apache.spark.sql.functions.not

df.where($"referrer".contains("www.mydomain.") &&
  not($"referrer".contains("google")))

或单独的过滤器:

df
 .where($"referrer".contains("www.mydomain."))
 .where(!$"referrer".contains("google"))

【讨论】:

这是我要找的 !$"referrer"。我应该尝试一下,但是蒙特卡洛的编码方法变得乏味,我找不到任何关于它的文档。谢谢! 嘿!帮助!,有什么方法可以通过与列进行比较来实现这一点?比如 $"referrer".contains($"column-that-shouldn't-match") @zero323 对特定的 pyspark 版本有效,我得到 import org.apache.spark.sql.functions.not DELV_all_cleaned_df2 = DELV_all_cleaned_df.where(not($'DELIV_LOC_DESC'.contains(expr) )) 导入 o​​rg.apache.spark.sql.functions.not DELV_all_cleaned_df2 = DELV_all_cleaned_df.where(not($'DELIV_LOC_DESC'.contains(expr))) 无效语法(,第 1 行)文件“” ,第 1 行导入 org.apache.spark.sql.functions.not ^ SyntaxError: invalid syntax 我同时使用了 df.filter 和 df.where,它们工作得很好,谢谢【参考方案2】:

您可以使用Regex。 Here 你可以找到在 Scala 中使用正则表达式的参考。 here 您可以找到一些关于如何为 URL 创建正确正则表达式的提示。

因此,在您的情况下,您将拥有以下内容:

val regex = "PUT_YOUR_REGEX_HERE".r // something like (https?|ftp)://www.mydomain.com?(/[^\s]*)? should work
val filteredDf = unfilteredDf.filter(regex.findFirstIn(($"referrer")) match 
    case Some => true
    case None => false
 )

此解决方案需要一些工作,但最安全。

【讨论】:

这行不通。如果你想使用正则表达式,你有几个选择:1)like 使用 SQL 简单正则表达式,2)UDF 使用标准 Scala 正则表达式,3)转换为 RDD 并过滤 Row 对象

以上是关于有没有办法使用scala过滤不包含spark数据框中某些内容的字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用过滤器从scala中的数据框中获取包含空值的行集

Spark使用类将rdd转换为数据框

Spark:在scala中的数据帧上使用动态过滤器进行聚合

如何在 Scala/Spark 中为数据框中的每一行编写一个 Json 文件并重命名文件

有没有办法从 Scala 中数据框的现有列创建多个列?

过滤包含Scala Spark数据帧中数组的列中的数组长度[重复]