为了账号安全,请及时绑定邮箱和手机立即绑定

高效的字符串后缀检测

高效的字符串后缀检测

蓝山帝景 2021-10-26 18:51:59
我正在使用 PySpark 处理一个巨大的数据集,我想根据另一个数据框中的字符串过滤数据框。例如,dd = spark.createDataFrame(["something.google.com","something.google.com.somethingelse.ac.uk","something.good.com.cy", "something.good.com.cy.mal.org"], StringType()).toDF('domains')+----------------------------------------+|domains                                 |+----------------------------------------+|something.google.com                    ||something.google.com.somethingelse.ac.uk||something.good.com.cy                   ||something.good.com.cy.mal.org           |+----------------------------------------+  dd1 =  spark.createDataFrame(["google.com", "good.com.cy"], StringType()).toDF('gooddomains')+-----------+|gooddomains|+-----------+|google.com ||good.com.cy|+-----------+我假设domains和gooddomains是有效的域名。我想要做的是过滤掉dd不以dd1. 所以在上面的例子中,我想过滤掉第 1 行和第 3 行,最后得到+----------------------------------------+|domains                                 |+----------------------------------------+|something.google.com.somethingelse.ac.uk||something.good.com.cy.mal.org           |+----------------------------------------+  我当前的解决方案(如下所示)最多只能考虑 3 个“单词”的域。如果我verygood.co.ac.uk在dd1(即白名单)中添加 say ,那么它将失败。def split_filter(x, whitelist):    splitted1 = x.select(F.split(x['domains'], '\.').alias('splitted_domains'))    last_two = splitted1.select(F.concat(splitted1.splitted_domains[F.size(splitted1.splitted_domains)-2], \       F.lit('.'), \       splitted1.splitted_domains[F.size(splitted1.splitted_domains)-1]).alias('last_two'))    last_three = splitted1.select(F.concat(splitted1.splitted_domains[F.size(splitted1.splitted_domains)-3], \       F.lit('.'), \       splitted1.splitted_domains[F.size(splitted1.splitted_domains)-2], \       F.lit('.'), \       splitted1.splitted_domains[F.size(splitted1.splitted_domains)-1]).alias('last_three'))我在 Python 2.7.5 中使用 Spark 2.3.0。
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信