首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在python中从HDFS序列文件加载数据

如何在python中从HDFS序列文件加载数据
EN

Stack Overflow用户
提问于 2015-11-13 09:43:54
回答 1查看 7.8K关注 0票数 1

我运行了一个map reduce程序来读取HDFS文件,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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字符串,因此映射器按如下方式读取该文件:

代码语言:javascript
代码运行次数:0
运行
复制
for line in sys.stdin:
    try:
        object = json.loads(line)

但HDFS的所有者将文件从文本更改为序列文件。我发现map reduce程序输出了许多零大小的文件,这可能意味着它没有成功地从HDFS读取文件。

我应该对代码进行哪些更改才能从序列文件中读取?我还有一个配置单元外部表,用于根据mapreduce的输出执行聚合和排序,并且该配置单元以前存储为TEXTFILE,我是否应该更改为存储为SEQUENCEFILE?

谢谢,

EN

回答 1

Stack Overflow用户

发布于 2015-11-13 09:58:18

看一看this

在执行mapreduce作业之前,在python文件下运行

输入:您的序列文件

输出:您对mapreduce的输入

代码语言:javascript
代码运行次数:0
运行
复制
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()

现在你不需要修改你原来的python文件了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33684625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档