我想在数据帧列上运行自定义函数。该列有一个长字符串,其中包含一些电子邮件。字符串格式是这样的:
"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,还是可以减少因为它是一种聚合函数?
有什么想法吗?
答案 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。