如何将HDFS中双层分区Parquet文件优雅加载到Hive分区表
最优方案:直接创建标准分区表+分区元数据修复
你的HDFS路径完全符合Hive原生的分区目录命名规范(分区键=分区值格式),不需要中间表、不需要手动执行load语句,两步即可完成导入,且不会修改原始文件:
- 创建双层分区的外部表,注意
datekey和coeff作为分区字段不要写在普通字段列表中,要单独定义在PARTITIONED BY子句里:
CREATE EXTERNAL TABLE IF NOT EXISTS simulations ( -- 此处替换为Parquet文件中实际存储的字段列表,无需包含datekey、coeff col1 string, col2 int, ... ) PARTITIONED BY (datekey string, coeff double) STORED AS PARQUET LOCATION '/user/hive/warehouse/datascience.db/simulations';
- 执行分区修复命令,Hive会自动扫描路径下的所有目录,从目录名中提取
datekey和coeff的取值,自动生成分区元数据:
MSCK REPAIR TABLE simulations;
提示:如果使用较新版本的Hive支持分区自动发现,可以跳过第二步,直接查询表即可自动加载分区。后续新增分区目录后,重新执行一次修复命令即可加载新分区。如果需要使用内部表存储,建完外部表后通过
INSERT语句整表写入内部表即可。
备选方案:动态分区加载(适配非标准目录结构场景)
如果后续遇到目录命名不符合Hive规范的同类场景,可以通过Hive虚拟列INPUT__FILE__NAME提取文件路径,解析出分区值后做动态分区写入,无需为每个分区单独写加载语句:
- 先创建指向根目录的临时非分区外部表:
CREATE EXTERNAL TABLE IF NOT EXISTS tmp_simulations ( -- 此处替换为Parquet文件中实际存储的字段列表 col1 string, col2 int, ... ) STORED AS PARQUET LOCATION '/user/hive/warehouse/datascience.db/simulations';
- 开启动态分区配置后,从临时表查询并解析分区字段,写入最终分区表:
-- 开启动态分区相关配置 SET hive.exec.dynamic.partition = true; SET hive.exec.dynamic.partition.mode = nonstrict; INSERT OVERWRITE TABLE simulations PARTITION(datekey, coeff) SELECT t.*, regexp_extract(INPUT__FILE__NAME, 'datekey=(\\d+)/', 1) AS datekey, cast(regexp_extract(INPUT__FILE__NAME, 'coeff=(\\d+\\.?\\d*)/', 1) AS double) AS coeff FROM tmp_simulations t;
内容的提问来源于stack exchange,提问作者hunterm
相关产品推荐
相关产品推荐

