问题:我想从hdfs读取文件的一部分并返回它,例如从1000行的文件中读取101-120行。
我不想用 seek
因为我读到它很贵。
我有日志文件,我正在使用pig将其处理成有意义的数据集。我一直在编写一个api来返回数据供前端使用和显示。这些处理过的数据集可能足够大,我不想一次就从hadoop中读取整个文件,以节省连线时间和带宽(比如说5-10mb)
目前我正在使用 BufferedReader
返回工作正常的小摘要文件
ArrayList lines = new ArrayList();
...
for (FileStatus item: items) {
// ignoring files like _SUCCESS
if(item.getPath().getName().startsWith("_")) {
continue;
}
in = fs.open(item.getPath());
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
line = br.readLine();
while (line != null) {
line = line.replaceAll("(\\r|\\n)", "");
lines.add(line.split("\t"));
line = br.readLine();
}
}
我已经在互联网站和堆栈上翻了很多遍,但还没有找到我真正需要的东西。
也许这样做完全是错误的,我需要一组完全独立的代码和不同的函数来管理它。愿意接受任何建议。
谢谢!
根据以下讨论的研究,我们注意到:hadoop进程记录如何跨越块边界分割?hadoop文件分割读取
1条答案
按热度按时间r6hnlfcb1#
我认为seek是读取大容量文件的最佳选择。它没有给我造成任何问题,因为我正在读取的数据量在2-3gb的范围内。直到今天我还没有遇到任何问题,但是我们确实使用了文件分割来处理大数据集。下面是你可以用来阅读和测试的代码。