python - 如何在Hadoop Map Reduce Framework的reducer阶段中使用唯一名称创建用户特定的文件(在Python中)

标签 python python-2.7 hadoop hdfs hadoop-streaming

我为 reducer 编写了一个代码,该代码将读取映射器的输出。然后,它将创建一个具有键名的新文件,并且对应于同一键的所有值都将存储到一个文件中。

我的代码是:

!/usr/bin/env python

import sys

last_key      = None              #initialize these variables

for input_line in sys.stdin:

    input_line = input_line.strip()
    data = input_line.split("\t") 
    this_key = data[0]
    if len(data) == 2:
        value = data[1]
    else:
        value = None
    if last_key == this_key:
        if value:
            fp.write('{0}\n'.format(value))
    else:
        if last_key:
            fp.close()
            fp = open('%s.txt' %this_key,'a')
            if value:
                fp.write('{0}\n'.format(value))
        if not last_key:
            fp = open('%s.txt' %this_key,'a')
            if value:
                fp.write('{0}\n'.format(value))
        last_key = this_key     

但是它没有创建任何文件。

因此,我的问题是我需要使用什么功能来将新文件创建到HDFS中。

最佳答案

没有简单的解决方案可以实现此目标。您可以按照以下方法使用Mapreduce实现此目标:

方法1:使用分区程序

  • 找出文件的唯一数量。例如计算文件中'%this_key%'的唯一编号。
  • 在mapreduce驱动程序[每个reducer的每个文件]中设置上一步结果的化简器数量。
  • 使用分区程序将映射输出发送到特定的reducer。
  • Reducer仅发出%value%。
  • 在作业结束时,每个文件将具有相同的键值,并且您可能会重命名reducer输出文件。

  • 方法2:如果文件数量很少,则使用MultipleOutputs

    关于python - 如何在Hadoop Map Reduce Framework的reducer阶段中使用唯一名称创建用户特定的文件(在Python中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38509221/

    相关文章:

    hadoop - 如何从配置单元中的字符串解析日期?

    Python Asyncio & Websocket 如何避免全局变量?

    python - 从给定日期计算下一个和第三个工作日

    django - 无法导入名称 is_secure_transport

    python - 如何使用 Python C/C++ 接口(interface)将实例成员函数作为 PyCFunction 类型传递

    hadoop - Hive 中的分层更新

    python - 从 JSON 中的不同嵌套级别提取对象名称

    python - 计算列表中唯一字符串的数量? python 3

    python - 如何将列添加到多索引数据帧?

    hadoop - 使用 Teradata 连接器的 Teradata 到 Hive 表导入工具