有没有办法使用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) )) 导入 org.apache.spark.sql.functions.not DELV_all_cleaned_df2 = DELV_all_cleaned_df.where(not($'DELIV_LOC_DESC'.contains(expr))) 无效语法(您可以使用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数据框中某些内容的字段?的主要内容,如果未能解决你的问题,请参考以下文章