我想使用EMR将文本文件的内容拆分为2个不同的文件。 输入文件以及mapper和reducer脚本都存储在AWS'S3中。 目前,我的mapper通过制表符分隔整个文件中的每个字段来重新格式化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根据特定字段的值将此文本文件拆分为2个不同的文件。 这是我当前的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作业失败并返回以下错误消息:关闭步骤失败。 我已经在每行使用fileReaders在本地测试了这两个脚本并且它可以工作。将任务导入EMR会导致问题。 我的问题是: - 是否可以使用EMR将文件拆分为2个或更多文件? - 如果是这样,S3是否阻止我动态创建新文件,从而使EMR作业失败? - 或者我的代码是否表现错误?
我感谢任何反馈。
谢谢。
答案 0 :(得分:0)
您尝试这样做的方式无法奏效。即使作业成功 - 您也可以设法将文件写入Hadoop集群中每个节点上的本地文件系统。最有可能的是 - 一旦作业完成,这些文件就会被丢弃。
奇怪的是,即使映射器发出了一个键\ tvalue结构 - reducer似乎也没有对给定键的值集合做任何事情。所以不清楚为什么甚至打扰分割数据[0]的地图输出? (也许我不理解上下文)
如果可能的话 - 这些将是更好的选择: