Parquet格式文件读写&合并小文件

发布时间 2024-01-09 08:36:54作者: 粒子先生

Parquet格式文件读写

依赖工具parquet-tools:

parquet-tools-1.6.0rc3-SNAPSHOT.jar

查看结构:

java -jar parquet-tools-1.6.0rc3-SNAPSHOT.jar schema -d pane-0-00000-of-00001-1597366079999.parquet | head -n 10

查看内容:

java -jar parquet-tools-1.6.0rc3-SNAPSHOT.jar head -n 10 pane-0-00000-of-00001-1597366079999.parquet

合并Parquet格式小文件

方法一

合并parquet小文件

hadoop jar parquet-tools-1.10.1.jar merge /dw/ods/judgmentDocumentFromFile/pt=default /dw/ods/judgmentDocumentFromFile/pt=207171218/a.parquet

parquet-tools-1.10.1.jar

方法二

Create Table As Select (CTAS),即用 hive 把数据从源表(含大量小文件)查出并插入到一张临时表,所有数据插入到临时表后,源表和临时表的表名互换即可。注意,你需要给 hive 会话添加下面的配置来控制小文件合并的条件:

# 控制每个任务合并小文件后的文件大小(默认256000000,256MB):
set hive.merge.size.per.task=2048000000;
# 告诉 hive 什么样的文件属于小文件(默认16000000,小于16MB):
set hive.merge.smallfiles.avgsize=512000000;
# 是否合并Map的输出文件(默认true):
set hive.merge.mapfiles=true;
# 是否合并Reduce的输出文件(默认false):
set hive.merge.mapredfiles=true;

另外,如果 hive 表是分区表,你可以写脚本每个分区遍历合并,但是每个分区合并都需要提交一个 mr job 明显效率不高。更好的做法是在 hive 会话开启动态分区,一次读取多个分区或者全表进行合并(视表的记录数量和集群内存选择吧),下面是开启动态分区的配置:

set hive.exec.dynamici.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

方法三

merge hdfs://172.31.5.20:9000 /dw/ods/judgmentDocumentFromFileBak parquet 256
mv hdfs://172.31.5.20:9000 /dw/ods/judgmentDocumentFromFileBak/pt=020101* /dw/ods/judgmentDocumentFromFileBak/pt=default