我正在尝试处理从hive表导入的大量行(数亿行)。作为输出,它将更多。 如果某些条件有效,我需要生成新行。但这不是问题。问题是如何存储这些配置单元行。 在这一刻,我使用对象的ArrayList,因为顺序对于我插入新行的算法非常重要,但是我得到了超过" GC开销限制"。
答案 0 :(得分:0)
您应该一次检索一页结果到新的ArrayList,处理该结果页面中的行,根据需要编写新行,然后将下一个结果页面加载到新的ArrayList中。垃圾收集(GC)将清理旧的ArrayList。
结果的排序应该是数据库查询中的“ORDER BY”子句。
如果要插入同一个表并且想要避免重新处理要添加的行,那么您需要在表上使用一列来区分新行和现有行 - 例如自动递增的“id”或“DATE_CREATED”。
答案 1 :(得分:0)
我正在尝试处理从hive表导入的大量行...但是我得到了“超出GC开销限制”。
你有几个选择。正如@DarrenKennedy所提到的,如果某种方法一次只能处理一个页面,那么这将是最佳的,但听起来这不是一个选项,因为自定义排序。
所以你有两种可能性:
增加内存大小以适合所有行。我怀疑这也不是一个选择,但我想我会说出来。
在内存中处理批处理,将其写入磁盘,然后在最后处理批处理文件。见下文。
要批量处理,您需要读取一堆输入行,这些输入行可以很好地适应内存,对它们进行排序和过滤,然后将每个串写出自己的本地临时文件。如果您正在使用云系统,那么短暂的存储将是非常好的。
处理完所有配置单元输入行后,将它们排序并写入一堆临时文件,然后您需要返回并读取并处理执行插入排序的已排序行。这是一些伪代码:
BufferedReader
或其他类似文件打开所有临时文件。 希望这有帮助。