首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用mrjob处理LZO序列文件

用mrjob处理LZO序列文件
EN

Stack Overflow用户
提问于 2013-09-18 20:55:35
回答 1查看 938关注 0票数 2

我正在使用马约伯编写一个任务,使用Google数据计算各种统计数据:https://aws.amazon.com/datasets/8172056142375670

我使用标签分隔文本中数据的未压缩子集在本地开发和测试了我的脚本。一旦我试图运行该作业,就会出现以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "ngram_counts.py", line 74, in <module>
    MRNGramCounts.run()
  File "/usr/lib/python2.6/dist-packages/mrjob/job.py", line 500, in run
    mr_job.execute()
  File "/usr/lib/python2.6/dist-packages/mrjob/job.py", line 509, in execute
    self.run_mapper(self.options.step_num)
  File "/usr/lib/python2.6/dist-packages/mrjob/job.py", line 574, in run_mapper
    for out_key, out_value in mapper(key, value) or ():
  File "ngram_counts.py", line 51, in mapper
    (ngram, year, _mc, _pc, _vc) = line.split('\t')
ValueError: need more than 2 values to unpack
(while reading from s3://datasets.elasticmapreduce/ngrams/books/20090715/eng-1M/5gram/data)

这大概是因为公共数据集的压缩方案(来自上面的URL链接):

我们将数据集存储在亚马逊S3中的单个对象中。该文件采用顺序文件格式,具有块级LZO压缩。序列文件键是作为LongWritable存储的数据集的行号,值是作为TextWritable存储的原始数据。

有关于如何设置可以处理这些文件的工作流的指导吗?我已经找遍了所有的窍门,但没有发现任何有用的东西.

(我是mrjob和Hadoop的相对n00b。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-19 05:14:49

我终于弄明白了。看起来EMR负责LZO压缩,但是对于序列文件格式,您需要将以下HADOOP_INPUT_FORMAT字段添加到您的MRJob类中:

代码语言:javascript
复制
class MyMRJob(MRJob):

    HADOOP_INPUT_FORMAT = 'org.apache.hadoop.mapred.SequenceFileAsTextInputFormat'

    def mapper(self, _, line):
        # mapper code...

    def reducer(self, key, value):
        # reducer code...

还有另一个问题(引用由AWS托管的Google NGrams页面):

序列文件键是作为LongWritable存储的数据集的行号,值是作为TextWritable存储的原始数据。

这意味着每一行都被加上了超长+ TAB,所以在mapper方法中所做的任何行解析都需要考虑前面的信息。

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

https://stackoverflow.com/questions/18882197

复制
相关文章

相似问题

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