Hadoop的streamingAPI与MapReduce[Python]

文章目录

  • 1.创建模拟文本
  • [2. 使用mapperduce统计标签分布和抽取指定标签](#2. 使用mapperduce统计标签分布和抽取指定标签)
  • [3. 运行Map函数并排序结果以模拟Reduce任务:](#3. 运行Map函数并排序结果以模拟Reduce任务:)
  • 4.运行在无网络开发机上

1.创建模拟文本

1.1 机器模拟生成

python 复制代码
from collections import namedtuple
from faker import Faker

# 初始化Faker
fake = Faker()

# 定义一个namedtuple类型,包含id, subject, text字段
GaokaoQuestion = namedtuple('GaokaoQuestion', 'id subject text')

# 定义生成模拟数据的函数
def generate_faker_data(num_samples):
    data = []
    for _ in range(num_samples):
        # 使用faker生成数据
        subject = fake.word()
        text = fake.sentence()
        
        # 使用md5生成id
        id_value = f"{text} {subject}"
        id_hash = hashlib.md5(id_value.encode('utf-8')).hexdigest()
        
        # 创建namedtuple实例
        question = GaokaoQuestion(id=id_hash, subject=subject, text=text)
        data.append(question)
    return data

# 生成3条模拟数据
samples = generate_faker_data(3)

# 打印生成的数据
for sample in samples:
    print(sample)

2.手动生成

shell 复制代码
cat > test_data.jsonl << EOF
{"id":"1", "subject":"Math", "text":"Math question"}
{"id":"2", "subject":"Science", "text":"Science question"}
{"id":"3", "subject":"Math", "text":"Another Math question"}
EOF

2. 使用mapperduce统计标签分布和抽取指定标签

python 复制代码
#!/usr/bin/env python3
import sys
import json
from collections import defaultdict

# 指定需要抽取的subject标签列表
TARGET_SUBJECTS = ["数学", "物理"]

def mapper():
    for line in sys.stdin:
        data = json.loads(line)
        if data['subject'] in TARGET_SUBJECTS:
            print(json.dumps(data))


def reducer():
    counts = defaultdict(int)
    for line in sys.stdin:
        subject, count = line.strip().split('\t')
        counts[subject] += int(count)
    for subject, count in counts.items():
        print(f"{subject}\t{count}")

if __name__ == "__main__":
    if len(sys.argv) > 1 and sys.argv[1] == 'reduce':
        reducer()
    else:
        mapper()

3. 运行Map函数并排序结果以模拟Reduce任务:

python 复制代码
cat test_data.jsonl | python3 mapper_reducer.py | sort -k1,1 | python3 mapper_reducer.py reduce

4.运行在无网络开发机上

Shell 复制代码
# 假设input_data.jsonl是HDFS上的输入文件路径
# 假设output是HDFS上输出结果的路径

# 运行Map任务
hadoop fs -get /path/to/input_data.jsonl input_data.jsonl
python \Auser\tmp\mapper_reducer_script\mapper_reducer.py | sort -k1,1 > mapped_output.txt

# 运行Reduce任务
python \Auser\tmp\mapper_reducer_script\mapper_reducer.py reduce < mapped_output.txt > reduced_output.txt

# 将结果上传到HDFS
hadoop fs -put reduced_output.txt /path/to/output/
相关推荐
Metaphor6922 分钟前
使用 Python 在 PowerPoint 中创建折线图和条形图
python·信息可视化·powerpoint·图表
m沐沐1 小时前
【深度学习】卷积神经网络 数据增强、保存最优模型实现,详细解读
人工智能·python·深度学习·机器学习·cnn·数据增强
天青色等烟雨..1 小时前
全流程ArcGISPro空间分析、三维建模、可视化及Python融合应用技术
开发语言·python
极光代码工作室1 小时前
基于Spark的日志监控与分析平台
大数据·hadoop·python·spark·数据可视化
AOwhisky1 小时前
Python 学习笔记(第十三期)——运维自动化(下·前篇):远程命令执行——paramiko基础篇
运维·python·学习·云原生·自动化·运维开发·paramiko
浊酒南街2 小时前
subprocess.check_output函数介绍
python
TheBestRucy2 小时前
RAG知识库问答系统落地:从向量检索到上下文增强的全链路实践
人工智能·python·langchain·aigc·交互
AOwhisky2 小时前
Python 学习笔记(第十四期)——运维自动化(下·中篇):远程文件传输——paramiko进阶篇
运维·python·学习·云原生·自动化·文件传输·paramiko
其实防守也摸鱼2 小时前
补天SRC新手入门指南:从0到1的漏洞挖掘之路
网络·python·学习·安全·web安全·数据挖掘·挖洞
lupai2 小时前
手机在网状态查询 API 新手实战指南
大数据·python·智能手机