每隔15分钟,我需要将数据插入存储为ORC的不同表中并聚合这些值。那些INSERT使用动态分区。 每个INSERT在分区中创建一个新文件,这会减慢我的聚合查询。我在网上搜索,发现了一些关于此案例的主题,如this one.
所以我在hive-site.xml上添加了这些设置:
hive.merge.mapfiles =true;
hive.merge.mapredfiles =true;
hive.merge.tezfiles = true
hive.merge.smallfiles.avgsize=256000000;
但即使使用这些设置,每个插件也会在每个分区上创建一个新文件,并且文件不会合并。
有人知道如何解决这个问题吗?
我的群集是Azure HDInsight群集3.2,其中Hive 0.14,Tez 0.5.2。 我的插入查询就像这样:
INSERT INTO TABLE measures PARTITION(year, month, day)
SELECT area,
device,
date,
val,
year,
month,
day
FROM stagingmeasures
DISTRIBUTE BY year, month, day;
提前致谢
答案 0 :(得分:2)
为目标表创建交换表(如下所示),以便将所有小文件合并到一个文件中。 删除原始表并将交换表重命名为原始表。
一天做一次。
CREATE TABLE swap_measures SELECT * FROM measures;
DROP TABLE measures;
ALTER TABLE swap_measures RENAME TO measures;
答案 1 :(得分:0)
如果您的目标是使用ORC格式直接流入Hive,请查看以下链接以了解有关Hive Streaming API的更多信息
https://cwiki.apache.org/confluence/display/Hive/Streaming+Data+Ingest
希望这有帮助。