如何在Hadoop中从文本中解析CustomWritable



假设我在文本文件中有特定用户的时间戳值,如

#userid; unix-timestamp; value
1; 2010-01-01 00:00:00; 10
2; 2010-01-01 00:00:00; 20
1; 2010-01-01 01:00:00; 11
2; 2010-01-01 01:00:00, 21
1; 2010-01-02 00:00:00; 12
2; 2010-01-02 00:00:00; 22

我有一个自定义类"SessionSummary"实现WritableComparablereadFieldswrite。它的目的是汇总每个用户每个日历日的所有值。

因此,映射器将行映射到每个用户,reducer汇总每个用户每天的所有值,并将SessionSummary输出为TextOutputFormat(使用SessionSummary的toString,作为制表符分隔的UTF-8字符串):

1; 2010-01-01; 21
2; 2010-01-01; 41
1; 2010-01-02; 12
2; 2010-01-02; 22

如果我需要在第二个Map/Reduce阶段使用这些摘要条目,我应该如何解析这些摘要数据来填充成员?我可以通过使用文本String作为DataInput来重用现有的readFields和write方法(WritableComparable接口实现)吗?这(显然)不起作用:

public void map(...) {
    SessionSummary ssw = new SessionSummary();
    ssw.readFields(new DataInputStream(new ByteArrayInputStream(value.getBytes("UTF-8"))));
}

总的来说:是否有一种最佳实践可以在Hadoop中实现自定义键和值,并使它们在几个M/R阶段中易于重用,同时在每个阶段都保持可读的文本输出

(Hadoop版本为0.20.2/CDH3u3)

第一个MR作业的输出格式应该是SequenceFileOutputFormat-这将以二进制格式存储从reducer输出的Key/Values,然后可以使用SequenceFileInputFormat在第二个MR作业中读回。还要确保相应地设置了Job上的outputKeyClassoutputValueClass

第二个作业中的映射器具有SessionSummary(以及任何值类型)

如果您需要查看第一个MR作业的文本输出,可以在HDFS中的输出文件上运行以下操作:

hadoop fs -libjars my-lib.jar -text output-dir/part-r-*

这将读取序列文件Key/Value对,并在两个对象上调用toString(),在输出到stdout时用制表符分隔它们。-libjars指定hadoop可以在哪里找到您的自定义Key/Value类

相关内容

  • 没有找到相关文章

最新更新