我有一个应用程序需要读取一个文件,这是ArrayList的序列化结果。(ArrayList<String>,此列表中的50000条记录,大小: 20MB)我不知道如何准确地将数据读取到hadoop平台。我只有点感觉我需要覆盖InputFormat和OutpurFormat。我是hadoop平台的初学者。你能给我一些建议吗?
谢谢,
郑。
发布于 2012-10-06 21:09:23
首先,您需要扩展FileInputFormat,特别是要实现抽象的FileInputFormat.createRecordReader方法。
您可以查看诸如LineRecordReader ( TextInputFormat用来处理文本文件)之类的代码的源代码。
从那时起,你基本上只能靠自己了(也就是说,这取决于你的ArrayList是如何序列化的)。查看LineRecordReader的源代码,并尝试将其与ArrayList的序列化方式联系起来。
还有一些需要注意的地方,你的文件格式是可拆分的吗?例如,您是否可以在文件中查找偏移量并从那里恢复流(文本文件可以,因为它们只向前扫描到当前行的末尾,然后从那里开始)。如果您的文件格式使用压缩,您还需要考虑到这一点(例如,您不能随机查找gzip文件中的某个位置)。默认情况下,FileInputFormat.isSplittable将返回true,您可能希望最初将其覆盖为false。如果你坚持使用“不可拆分”,那么请注意,你的文件将由单个映射器处理(与其大小无关)。
发布于 2012-10-07 05:46:44
在Hadoop上处理数据之前,您应该将数据上传到HDFS或其他受支持的文件系统。如果您正在控制上传过程,您可以将上传阶段的数据转换为您可以轻松处理的数据,例如:
如果数组可以包含带有'\n'的行,则
这是最简单的解决方案,因为您不必干预Hadoop的内部结构。
https://stackoverflow.com/questions/12759651
复制相似问题