快捷搜索: 王者荣耀 脱发

巧妙利用sql方式对hive表小文件合并

第一种方法:在hive对应的hdfs文件夹下做小文件合并。 第二种方法:直接通过ETL sql, 可以完成hdfs底层合并. 非常方便

例如:ods_page_log 表。 (刚刚完成抽取、追加,等操作。在ETL完成最后,可追加一个步骤。 )

合并操作:

# 建一张结构一样的临时表、插入数据到临时表、
# 删除原始表、把临时表再命名为原始表的名字
create table tmp_ods_page_log  like ods_page_log; 
insert into tmp_ods_page_log select  * FROM ods_page_log;
drop table ods_page_log;
ALTER TABLE tmp_ods_page_log RENAME TO ods_page_log;

此时再到hdfs中查看,ods_page_log对应的hdfs文件夹下、发现小文件数量变少了。

(目前该方法还没有做分区表的测试。分区文件夹的小文件应该也是会被合并的,文章待续~)

该功能可在该表ETL完成最后,对表进行合并操作。 如果所有hive表最后都可以这样。 小文件数量会大大降低。 当然并不是所有表ETL最后都需要合并,也可做成随机功能模块,根据“资源盈余、表本身大小、是否正在使用等”参数来判断是否能启动合并sql。

经验分享 程序员 微信小程序 职场和发展