我有一堆文本文件被分类,我想为每个类别创建一个序列文件,其中键是类别名称,值包含该类别所有文件的所有文本内容。
我有一个只有两列的nosql数据库。每行代表一个文件,第一列是类别名称,第二列是存储在HDFS上的文本文件的绝对地址。我的映射器读取数据库和输出对,其中键是类别,值是绝对地址。在reducer方面,我有每个类别的所有文件的地址,我想为每个类别创建一个序列文件,其中键是类别名称,值包含属于所有文件的所有文本内容到那个类别。
一个简单的解决方案是迭代对(在reducer中)并逐个打开文件,并将其内容附加到String变量,最后使用MultipleOutputs
创建一个序列文件。但是,由于文件大小可能很大,因此将内容附加到单个String可能是不可能的。有没有办法不使用String变量?
答案 0 :(得分:0)
然后,由于您拥有reducer中的所有文件,您可以获取这些文件的内容,并使用StringBuilder追加以节省内存,然后丢弃该StringBuilder引用。如果避免String是你的问题,StringBuilder是一个快速的方法。涉及文件访问和读取的IO操作是资源密集型的。然而,鉴于hadoop中的reducer架构,数据本身应该没问题。
您还可以考虑使用合成器。但是,这主要用于减少地图之间的流量和减少。您可以在组合器处准备部分序列文件,然后保留在reducer级别。只有当内容可以根据具体顺序添加而不是基于特定顺序时,这才有效。