前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >账户合并

账户合并

原创
作者头像
代码小李
发布2025-01-28 23:30:18
发布2025-01-28 23:30:18
6000
代码可运行
举报
运行总次数:0
代码可运行

给定一组账户,每个账户有一个名称和一组电子邮件地址。电子邮件地址可能会在多个账户中重复出现。如果两个账户有相同的电子邮件地址,则认为这两个账户属于同一用户。请将这些账户合并,并输出合并后的账户。

输入格式

第一行是一个整数 n1 ≤ 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 实现这个任务,我们可以按照以下步骤进行:

  1. 读取输入数据:将输入数据读取为一个 RDD。
  2. 解析数据:将每个账户的名称和电子邮件地址分开,并创建一个 (email, name) 的键值对。
  3. 合并账户:使用 groupByKey 将相同的电子邮件地址归类到同一个用户。
  4. 构建最终结果:将每个用户的电子邮件地址按字典序排序,并将结果按账户名称排序。

以下是完整的 Spark 实现代码:

代码语言:python
代码运行次数:0
复制
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()

解释

  1. 初始化 SparkContext:创建一个 SparkContext 对象,用于运行 Spark 作业。
  2. 读取输入数据:将输入数据存储在一个列表中,并将其转换为 RDD。
  3. 解析数据:定义 parse_account 函数,将每行数据解析为 (email, name) 的键值对。
  4. 生成键值对:使用 flatMap 将每行数据转换为多个 (email, name) 键值对。
  5. 合并账户:使用 groupByKey 将相同的电子邮件地址归类到同一个用户,并将结果转换为列表。
  6. 构建最终结果:定义 build_result 函数,将每个用户的电子邮件地址按字典序排序,并将结果按账户名称排序。
  7. 输出结果:打印最终结果。
  8. 停止 SparkContext:停止 SparkContext 以释放资源。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 输入格式
  • 输出格式
  • 输入样例
  • 输出样例
  • 解释
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档