java如何将较小的ORC文件合并成较大的ORC文件?
SO和web上的大多数问题/答案都讨论使用Hive将一堆小的ORC文件合并成一个更大的文件,然而,我的ORC文件是日志文件,按天分开,我需要将它们分开。我每天只想“汇总”ORC文件(它们是HDFS中的目录)
我很可能需要用Java编写解决方案,并且遇到了OrcFileMergeOperator,这可能是我需要使用的,但现在说还为时过早
解决这个问题的最佳方法是什么
你可以在下面搜索框中键入要查询的问题!
SO和web上的大多数问题/答案都讨论使用Hive将一堆小的ORC文件合并成一个更大的文件,然而,我的ORC文件是日志文件,按天分开,我需要将它们分开。我每天只想“汇总”ORC文件(它们是HDFS中的目录)
我很可能需要用Java编写解决方案,并且遇到了OrcFileMergeOperator,这可能是我需要使用的,但现在说还为时过早
解决这个问题的最佳方法是什么
# 1 楼答案
你不需要重新发明轮子
ALTER TABLE table_name [PARTITION partition_spec] CONCATENATE
可用于将较小的ORC文件合并为较大的文件,因为Hive 0.14.0.
合并发生在条带级别,从而避免了对数据进行解压缩和解码。它工作得很快。我建议创建一个按天分区的外部表(分区是目录),然后合并它们,指定PARTITION (day_column)
作为分区规范请看这里:LanguageManual+ORC
# 2 楼答案
这里有很好的答案,但这些都不允许我运行cron作业,这样我就可以每天进行汇总。我们每天都有日志文件写入HDFS,我不想每天进来时都在Hive中运行查询
对我来说,我最终做的事情似乎更直截了当。我编写了一个Java程序,使用ORC库扫描目录中的所有文件,并创建这些文件的列表。然后打开一个新的Writer,它是“组合”文件(以“.”开头)所以它对蜂巢是隐藏的,否则蜂巢就会失败)。然后,程序打开列表中的每个文件,读取内容并写入组合文件。读取所有文件后,它会删除这些文件。我还增加了在需要时一次运行一个目录的功能
注意:您需要一个模式文件。日志日志可以以json“journalctl-o json”格式输出,然后您可以使用ApacheORC工具生成模式文件,也可以手动生成一个模式文件。ORC的自动发电机很好,但手动发电机总是更好
注意:要按原样使用这段代码,您需要一个有效的keytab并在类路径中添加-Dkeytab=