配置单元从动态位置加载外部 table(已分区)
hive load external table from dynamic location(partitioned)
我需要创建一个配置单元 table(外部)来加载另一个进程生成的数据。我需要按日期分区,但问题是,路径中有一个随机字符串。
示例输入路径:
/user/hadoop/output/FDQM9N4RCQ3V2ZYT/20170314/
/user/hadoop/output/FDPWMUVVBO2X74CA/20170315/
/user/hadoop/output/FDPGNC0ENA6QOF9G/20170316/
.........
.........
目录中的第 4 个字段是动态的(无法猜测)。这些目录中的每一个都会有多个 .gz 文件
创建 table 时我会给出什么位置?
CREATE EXTERNAL TABLE user (
userId BIGINT,
type INT,
date String
)
PARTITIONED BY (date String)
LOCATION '/user/hadoop/output/';
这是正确的吗?如果是这样,我如何根据日期(目录中的最后一个字段)对其进行分区?
由于您没有使用分区约定,因此您必须手动添加每个分区。
- table 位置无关紧要,但为了清晰起见,请保持原样。
- 我建议使用
date
分区类型或至少使用 ISO 格式,YYYY-MM-DD
。
- 我不会使用
date
作为列名(也不会使用 int
、string
等)。
PARTITIONED BY (dt date)
alter table user add if not exists partition (dt=date '2017-03-14') location '/user/hadoop/output/FDQM9N4RCQ3V2ZYT/20170314';
alter table user add if not exists partition (dt=date '2017-03-15') location '/user/hadoop/output/FDPWMUVVBO2X74CA/20170315';
alter table user add if not exists partition (dt=date '2017-03-16') location '/user/hadoop/output/FDPGNC0ENA6QOF9G/20170316';
我需要创建一个配置单元 table(外部)来加载另一个进程生成的数据。我需要按日期分区,但问题是,路径中有一个随机字符串。
示例输入路径:
/user/hadoop/output/FDQM9N4RCQ3V2ZYT/20170314/
/user/hadoop/output/FDPWMUVVBO2X74CA/20170315/
/user/hadoop/output/FDPGNC0ENA6QOF9G/20170316/
.........
.........
目录中的第 4 个字段是动态的(无法猜测)。这些目录中的每一个都会有多个 .gz 文件
创建 table 时我会给出什么位置?
CREATE EXTERNAL TABLE user (
userId BIGINT,
type INT,
date String
)
PARTITIONED BY (date String)
LOCATION '/user/hadoop/output/';
这是正确的吗?如果是这样,我如何根据日期(目录中的最后一个字段)对其进行分区?
由于您没有使用分区约定,因此您必须手动添加每个分区。
- table 位置无关紧要,但为了清晰起见,请保持原样。
- 我建议使用
date
分区类型或至少使用 ISO 格式,YYYY-MM-DD
。 - 我不会使用
date
作为列名(也不会使用int
、string
等)。
PARTITIONED BY (dt date)
alter table user add if not exists partition (dt=date '2017-03-14') location '/user/hadoop/output/FDQM9N4RCQ3V2ZYT/20170314';
alter table user add if not exists partition (dt=date '2017-03-15') location '/user/hadoop/output/FDPWMUVVBO2X74CA/20170315';
alter table user add if not exists partition (dt=date '2017-03-16') location '/user/hadoop/output/FDPGNC0ENA6QOF9G/20170316';