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
方法二
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