【问题标题】:processing LZO sequence files with mrjob使用 mrjob 处理 LZO 序列文件
【发布时间】:2013-09-18 20:55:35
【问题描述】:

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

我使用制表符分隔文本中未压缩的数据子集在本地开发和测试了我的脚本。一旦我尝试运行该作业,我就会收到此错误:

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 链接):

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

有关如何设置可以处理这些文件的工作流程的任何指导?我已经详尽地搜索了提示,但没有找到任何有用的...

(我是 mrjob 和 Hadoop 的亲戚。)

【问题讨论】:

    标签: python hadoop lzo mrjob


    【解决方案1】:

    我终于想通了。看起来 EMR 为您处理 LZO 压缩,但对于序列文件格式,您需要将以下 HADOOP_INPUT_FORMAT 字段添加到您的 MRJob 类:

    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 的原始数据。

    这意味着每一行都带有额外的 Long + TAB 前缀,因此您在映射器方法中执行的任何行解析都需要考虑前置信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 2022-10-18
      相关资源
      最近更新 更多