高效的字符串后缀检测

我正在使用 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。


蓝山帝景
浏览 161回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python