如何在动态 hdfs 目录上创建分区配置单元 table

How to create partitioned hive table on dynamic hdfs directories

我很难让配置单元发现在 HDFS 中创建的分区

这是 HDFS 中的目录结构

warehouse/database/table_name/A
warehouse/database/table_name/B
warehouse/database/table_name/C
warehouse/database/table_name/D

A、B、C、D 是来自列 type

的值

当我使用以下语法创建配置单元时 table

CREATE EXTERNAL TABLE IF NOT EXISTS 
table_name(`name` string, `description` string) 
PARTITIONED BY (`type` string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' 
LOCATION 'hdfs:///tmp/warehouse/database/table_name'

我在查询 table 时看不到任何记录。

但是当我在 HDFS 中创建如下目录时

warehouse/database/table_name/type=A
warehouse/database/table_name/type=B
warehouse/database/table_name/type=C
warehouse/database/table_name/type=D

当我使用 show partitions table_name

检查时,它可以工作并发现分区

配置单元中是否有一些配置能够将动态目录检测为分区?

在某些目录之上创建外部 table 是不够的,还需要挂载分区。 Discover partitions feature added in Hive 4.0.0. Use MSCK REPAIR TABLE 早期版本:

MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];

或 EMR 上的等效项:

ALTER TABLE table_name RECOVER PARTITIONS;

并且当您使用 insert overwrite 创建动态分区时,会自动创建分区元数据并且分区文件夹的格式为 key=value