PySpark在列上应用自定义函数

时间:2016-11-30 01:27:04

标签: python apache-spark dataframe pyspark spark-dataframe

我想在数据帧列上运行自定义函数。该列有一个长字符串,其中包含一些电子邮件。字符串格式是这样的:

"Don Joe<abc@bankatfirst.com>,  Matt Scheurer <def@bankatfirst.com>, Dan Lawler <ghi@bankatfirst.com>"

我要运行正则表达式来提取电子邮件,然后我就可以找到整个列中有多少个唯一的电子邮件。

我可以编写正则表达式并在python中创建唯一的电子邮件列表。但我不知道如何在spark数据帧上应用此功能。我尝试过这样的事情:

all_names = set()

def get_distinct_users(userlist):
    global all_names
    for email in re.findall('\<\S*\>',userlist):
        all_names.add(email)

get_distinct_users_udf = udf(get_distinct_users,StringType())
users = users.withColumn("user_count",get_distinct_users_udf(users["users"]))

但是gloabl变量all_names没有得到更新。我应该应用map函数而不是创建UDF,还是可以减少因为它是一种聚合函数?

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以这样做的一种方法是import re def get_email(x): return re.findall("\<\S*\>", x) uniqueEmails = users.select("users").rdd\ .flatMap(lambda x: get_email(x[0]))\ .distinct() 一个函数来提取列上的电子邮件地址列表,例如

let task = NSURLSession.sharedSession().dataTaskWithURL(myUrl!) {(data, response, error) in
    guard let data = data else {
        return
    }
    print(String(data: data, encoding: NSUTF8StringEncoding))
}

task.resume()

将是不同电子邮件地址的RDD。