我正在使用 PySpark 處理一個(gè)巨大的數(shù)據(jù)集,我想根據(jù)另一個(gè)數(shù)據(jù)框中的字符串過濾數(shù)據(jù)框。例如,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|+-----------+我假設(shè)domains和gooddomains是有效的域名。我想要做的是過濾掉dd不以dd1. 所以在上面的例子中,我想過濾掉第 1 行和第 3 行,最后得到+----------------------------------------+|domains |+----------------------------------------+|something.google.com.somethingelse.ac.uk||something.good.com.cy.mal.org |+----------------------------------------+ 我當(dāng)前的解決方案(如下所示)最多只能考慮 3 個(gè)“單詞”的域。如果我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。
添加回答
舉報(bào)
0/150
提交
取消