Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Map Reduce拆分文件_Python_Amazon Web Services_Amazon S3_Boto_Emr - Fatal编程技术网

Python 使用Map Reduce拆分文件

Python 使用Map Reduce拆分文件,python,amazon-web-services,amazon-s3,boto,emr,Python,Amazon Web Services,Amazon S3,Boto,Emr,我想使用EMR将文本文件的内容拆分为两个不同的文件。 输入文件以及映射器和reducer脚本都存储在AWS的S3中。 目前,我的映射程序通过在整个文件中对每个字段进行制表符分隔来重新格式化stdin的输入 import sys import time first_line = True for line in sys.stdin: if first_line == True: first_line = False continue

我想使用EMR将文本文件的内容拆分为两个不同的文件。 输入文件以及映射器和reducer脚本都存储在AWS的S3中。 目前,我的映射程序通过在整个文件中对每个字段进行制表符分隔来重新格式化stdin的输入

import sys
import time

first_line = True

for line in sys.stdin:
    if first_line == True:
            first_line = False
            continue
    line= line.strip()
    data=line.split('|')
    d = data[0]
    for i in range(1,len(data)):
            d = d + '\t' +str(data[i])
    d = d+ '\n'
    print d
我的减速机是魔法发生的地方。 我希望reducer根据特定字段的值将此文本文件拆分为两个不同的文件。 这是我当前的reducer.py代码

mobile_inquiries = open("reducer_output/mob_inq.txt", "a")
transactions = open("reducer_output/transactions.txt", "a")
mob_merchant_id='"99031479997"'
mob_response_code = '"0"'
mob_request_codes = ['"400"','"401"','"402"','"403"','"450"','"408"','"2400"','"2401"','"2402"','"2408"','"6400"','"6405"','"6450"']

for line in sys.stdin:          
    line= line.strip()
    data=line.split('\t')
    d = data[0]
    merchant_id = data[4]
    request_code = data[10]
    response_code = data[19]

# Writes to mobile inquiry file
    if (merchant_id == mob_merchant_id) and (response_code == mob_response_code) and (request_code in mob_request_codes):
        d = d + '\t' +str(data[9])+ '\t' + str(data[28])+'\n'               
        mobile_inquiries.write(d)
# Writes to transaction file
    else:
        d = d + '\t' +str(data[9])+ '\t' + str(data[6])+ '\t' + str(data[4])+ '\t' + str(data[26])+ '\t' + str(data[10])+ '\t' + str(data[19])+ '\t' + str(data[28])+ '\n'
        transactions.write(d)
mobile_inquiries.close()
transactions.close()
此EMR作业失败并返回以下错误消息:步骤失败时关闭。 我已经在每一行上使用文件读取器在本地测试了这两个脚本,并且都能正常工作。将任务导入到EMR会导致问题。 我的问题是: -是否可以使用EMR将文件拆分为2个或更多文件? -如果是这样,S3是否会阻止我动态创建新文件,从而导致EMR作业失败? -还是我的代码行为错误

我感谢所有的反馈


谢谢。

您试图这样做是行不通的。即使作业成功,您也可以将文件写入Hadoop集群中每个节点上的本地文件系统。最有可能的情况是,一旦作业完成,这些文件将被丢弃

奇怪的是,即使映射器发出key\tvalue结构,reducer似乎对给定键的值集合没有任何作用。所以我们不清楚为什么还要用数据[0]分割地图输出?(也许我不理解上下文)

如果可能,这些将是更好的选择:

  • 首先使用仅地图作业将输入数据拆分为两个数据集(移动查询和事务)。如果您愿意使用配置单元,您可以选择一个表,然后根据谓词(就像Python代码中的谓词一样)插入两个目录(在HDFS或S3中)
  • 现在输入已被拆分-在每个输出上运行一个map reduce作业。这可以执行任何映射/减少功能。FWIW—这里编码的map reduce函数实际上不需要Python—可以直接用标准配置单元SQL表示

关于组合CSV行的简短评论:您可以更轻松地使用“\t”。加入(列表)。有关此内容的更新。在一些人的帮助下,我意识到我的第一步将是只做地图绘制工作。作业将根据某些字段的值将输入文件拆分为移动查询和事务。我能够分离这些记录,并且生成的输出文件是正确的。但是,我希望将它们拆分为2个文件,而不是基于运行的还原器数量的文件。我正在阅读有关MultipleTextOutputFormat的文章,并试图找到一种方法,使用python将其合并到AWS EMR的附加参数中。到目前为止还没有成功。你知道如何做到这一点吗?为什么你关心文件的数量?下面是一个场景,我有一个文件中有记录。我需要根据特定条件标记记录为真或假。然后我需要比较真实记录和虚假记录,以提取另一种类型的记录。我的第一个目标是将原始文件拆分为两个文件,其中包含每种类型的true和false值。稍后,我将使用EMR执行基于键的连接操作,以提取我需要的最终记录类型。hadoop(和hive)主要在目录级别工作。只需将输入分为两个目录即可。然后,EMR或Hive将能够连接这两个目录。