如何在python中从HDFS sequencefile加载数据
我运行了一个map reduce程序来读取HDFS文件,如下所示:如何在python中从HDFS sequencefile加载数据,python,hadoop,mapreduce,hive,sequencefile,Python,Hadoop,Mapreduce,Hive,Sequencefile,我运行了一个map reduce程序来读取HDFS文件,如下所示: hadoop jar /opt/mapr/hadoop/hadoop-0.20.2/contrib/streaming/hadoop-0.20.2-dev-streaming.jar -Dmapred.reduce.tasks=1000 -file $homedir/mapper.py -mapper $homedir/mapper.py -file $homedir/reducer.py -reducer $homedir/
hadoop jar /opt/mapr/hadoop/hadoop-0.20.2/contrib/streaming/hadoop-0.20.2-dev-streaming.jar -Dmapred.reduce.tasks=1000 -file $homedir/mapper.py -mapper $homedir/mapper.py -file $homedir/reducer.py -reducer $homedir/reducer.py -input /user/data/* -output /output/ 2> output.text
任何需要确认的内容,路径/user/data/*包含文件夹,包括文件,/user/data/*将迭代所有子文件夹下的所有文件,对吗
hdfs文本文件的每一行都包含一个JSON字符串,因此映射程序按如下方式读取该文件:
for line in sys.stdin:
try:
object = json.loads(line)
但是HDFS的所有者将文件从文本更改为sequencefile。我发现MapReduce程序输出了很多零大小的文件,这可能意味着它没有成功地从HDFS读取文件
我应该将什么更改为代码,以便可以读取sequencefile?我还有一个配置单元外部表,用于根据mapreduce的输出执行聚合和排序,并且配置单元以前存储为TEXTFILE,我是否应该更改为存储为SEQUENCEFILE
谢谢,看一看
在mapreduce作业之前在python文件下方运行输入:您的序列文件
输出:您对mapreduce的输入
import sys
from hadoop.io import SequenceFile
if __name__ == '__main__':
if len(sys.argv) < 3:
print 'usage: SequenceFileReader <filename> <output>'
else:
reader = SequenceFile.Reader(sys.argv[1])
key_class = reader.getKeyClass()
value_class = reader.getValueClass()
key = key_class()
value = value_class()
#reader.sync(4042)
position = reader.getPosition()
f = open(sys.argv[2],'w')
while reader.next(key, value):
f.write(value.toString()+'\n')
reader.close()
f.close()
导入系统
从hadoop.io导入SequenceFile
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
如果len(sys.argv)<3:
打印“用法:SequenceFileReader”
其他:
reader=SequenceFile.reader(sys.argv[1])
key\u class=reader.getKeyClass()
value\u class=reader.getValueClass()
key=key\u class()
value=value\u class()
#reader.sync(4042)
position=reader.getPosition()
f=打开(sys.argv[2],'w')
while reader.next(键、值):
f、 写入(value.toString()+'\n')
reader.close()
f、 关闭()
您现在不必更改原始python文件。请查看
在mapreduce作业之前在python文件下方运行输入:您的序列文件
输出:您对mapreduce的输入
import sys
from hadoop.io import SequenceFile
if __name__ == '__main__':
if len(sys.argv) < 3:
print 'usage: SequenceFileReader <filename> <output>'
else:
reader = SequenceFile.Reader(sys.argv[1])
key_class = reader.getKeyClass()
value_class = reader.getValueClass()
key = key_class()
value = value_class()
#reader.sync(4042)
position = reader.getPosition()
f = open(sys.argv[2],'w')
while reader.next(key, value):
f.write(value.toString()+'\n')
reader.close()
f.close()
导入系统
从hadoop.io导入SequenceFile
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
如果len(sys.argv)<3:
打印“用法:SequenceFileReader”
其他:
reader=SequenceFile.reader(sys.argv[1])
key\u class=reader.getKeyClass()
value\u class=reader.getValueClass()
key=key\u class()
value=value\u class()
#reader.sync(4042)
position=reader.getPosition()
f=打开(sys.argv[2],'w')
while reader.next(键、值):
f、 写入(value.toString()+'\n')
reader.close()
f、 关闭()
您现在不必更改原始python文件。谢谢,我是否应该更改hadoop stream作业命令以运行此map reduce python脚本?我粘贴的第一个代码块。如果输入目录相同,则不必更改作业提交命令。您必须更改映射器。py谢谢。我使用hadoop流进行处理,mapper从stdint读取数据,但您的代码直接从代码中的文件读取(reader=SequenceFile.reader(“您的文件路径”)。如何从stdin中读取sequencefile?我看到一些帖子说将其添加到运行hadoop作业的命令中-inputformat SequenceFileAstextInputFormat非常感谢您的脚本将sequencefile转换为文本字符串,这样我就可以让代码像以前一样工作。但是这个文件的输出在本地磁盘上,但不是HDFS,对吗?我的hadoop mapreduce从HDFS获取输入。另外,我应该启用该参数吗-inputformat SequenceFileAstextInputFormatThank,我是否应该更改hadoop流作业命令以运行此map reduce python脚本?我粘贴的第一个代码块。如果输入目录相同,则不必更改作业提交命令。您必须更改映射器。py谢谢。我使用hadoop流进行处理,mapper从stdint读取数据,但您的代码直接从代码中的文件读取(reader=SequenceFile.reader(“您的文件路径”)。如何从stdin中读取sequencefile?我看到一些帖子说将其添加到运行hadoop作业的命令中-inputformat SequenceFileAstextInputFormat非常感谢您的脚本将sequencefile转换为文本字符串,这样我就可以让代码像以前一样工作。但是这个文件的输出在本地磁盘上,但不是HDFS,对吗?我的hadoop mapreduce从HDFS获取输入。另外,我应该启用该参数吗-inputformat序列文件AstextInputFormat