我正在使用 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。
添加回答
举报
0/150
提交
取消