- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设我在文本文件中有特定用户的时间戳值,例如
#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”实现readFields 和write 的WritableComparable。它的目的是汇总每个日历日每个用户的所有值。
所以 mapper 将行映射到每个用户,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 阶段,我应该如何解析此摘要数据以填充成员?我可以通过将文本字符串用作 DataInput 以某种方式重用现有的 readFields 和 write-methods(WritableComparable 接口(interface)实现)吗?这(显然)不起作用:
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 输出的键/值,然后可以在您的第二个 MR 中读回使用 SequenceFileInputFormat
的作业。还要确保在 Job
上相应地设置了 outputKeyClass
和 outputValueClass
。
第二个作业中的映射器有 SessionSummary
(以及任何值类型)
如果您需要查看第一个 MR 作业的文本输出,您可以在 HDFS 中的输出文件上运行以下命令:
hadoop fs -libjars my-lib.jar -text output-dir/part-r-*
这将读取序列文件键/值对,并在两个对象上调用 toString()
,在输出到标准输出时将它们分隔开。 -libjars
指定 hadoop 可以在哪里找到您的自定义键/值类
关于java - 如何从 Hadoop 中的文本解析 CustomWritable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9721754/
我有更多关于我的用例的 CustomWritable 必要性的设计问题: 所以我有一个文档对,我将通过管道处理它并将中间数据和最终数据写入 HDFS。我的 key 类似于 ObjectId - Doc
我更改了正常 IntWritable适当CustomerWritable class ,从那时起我的测试用例就失败了。我在这里做错了什么? /* this is my customWritable *
假设我在文本文件中有特定用户的时间戳值,例如 #userid; unix-timestamp; value 1; 2010-01-01 00:00:00; 10 2; 2010-01-01 00:00
我是一名优秀的程序员,十分优秀!