给定一组账户,每个账户有一个名称和一组电子邮件地址。电子邮件地址可能会在多个账户中重复出现。如果两个账户有相同的电子邮件地址,则认为这两个账户属于同一用户。请将这些账户合并,并输出合并后的账户。
第一行是一个整数 n
(1 ≤ n ≤ 1000
),表示账户的数量。
接下来的 n
行,每行表示一个账户。每个账户由账户名称和一个或多个电子邮件地址组成,名称和邮件地址用空格隔开。第一个为名称,后面是该账户的所有电子邮件地址。
输出合并后的账户,每个账户占一行,账户名称为第一个元素,后面是所有归属于该账户的电子邮件地址,地址按字典序排序。多个地址之间用空格隔开。账户按名称的字典序排序。
4
John johnsmith@mail.com john00@mail.com
John johnnybravo@mail.com
John johnsmith@mail.com john_newyork@mail.com
Mary mary@mail.com
John john00@mail.com john_newyork@mail.com johnsmith@mail.com
John johnnybravo@mail.com
Mary mary@mail.com
要使用 Apache Spark 实现这个任务,我们可以按照以下步骤进行:
groupByKey
将相同的电子邮件地址归类到同一个用户。以下是完整的 Spark 实现代码:
from pyspark import SparkContext
# 初始化 SparkContext
sc = SparkContext("local", "AccountMerger")
# 读取输入数据
input_data = [
"John johnsmith@mail.com john00@mail.com",
"John johnnybravo@mail.com",
"John johnsmith@mail.com john_newyork@mail.com",
"Mary mary@mail.com"
]
# 将输入数据转换为 RDD
rdd = sc.parallelize(input_data)
# 解析数据,生成 (email, name) 的键值对
def parse_account(line):
parts = line.split()
name = parts[0]
emails = parts[1:]
return [(email, name) for email in emails]
email_name_pairs = rdd.flatMap(parse_account)
# 使用 groupByKey 合并账户
name_emails = email_name_pairs.groupByKey().mapValues(list)
# 构建最终结果
def build_result(grouped_emails):
email_to_names = {}
for email, names in grouped_emails:
for name in names:
if name not in email_to_names:
email_to_names[name] = set()
email_to_names[name].add(email)
result = []
for name, emails in email_to_names.items():
sorted_emails = sorted(emails)
result.append((name, sorted_emails))
return result
final_result = build_result(name_emails.collect())
# 按账户名称排序
final_result.sort(key=lambda x: x[0])
# 输出结果
for name, emails in final_result:
print(name, *emails)
# 停止 SparkContext
sc.stop()
parse_account
函数,将每行数据解析为 (email, name) 的键值对。flatMap
将每行数据转换为多个 (email, name) 键值对。groupByKey
将相同的电子邮件地址归类到同一个用户,并将结果转换为列表。build_result
函数,将每个用户的电子邮件地址按字典序排序,并将结果按账户名称排序。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。