在 Hive 中为年、月和日创建表分区

Posted

技术标签:

【中文标题】在 Hive 中为年、月和日创建表分区【英文标题】:Create table partition in Hive for year,month and day 【发布时间】:2017-03-14 12:08:55 【问题描述】:

我的数据文件夹位于以下结构中,数据为 2 年(2015-2017)。

AppData/ContryName/year/month/Day/app1.json

例如:

AppData/India/2016/07/01/geek.json

AppData/India/2016/07/02/geek.json

AppData/US/2016/07/01/geek.json

现在我已经创建了一个带分区的外部表。

PARTITIONED BY (Country String, Year String, Month String, day String)

在此之后,我需要在 alter table 语句中添加分区。

ALTER TABLE mytable 
ADD PARTITION (country='India', year='2016',month='01', day='01') 
location 'AppData/India/2016/07/01/'

不可能每天都创建添加分区脚本,

有没有最简单的方法来实现这一点?

【问题讨论】:

请详细说明“不可能” 【参考方案1】:

msck repair table mytable,但不符合您当前的目录命名约定

演示

重击

hdfs dfs -mkdir -p /AppData/country=India/year=2016/month=07/day=01 
hdfs dfs -mkdir -p /AppData/country=India/year=2016/month=07/day=02
hdfs dfs -mkdir -p /AppData/country=US/year=2016/month=07/day=01

蜂巢

create table mytable (i int) 
partitioned by (country string, year string, month string, day string)
location '/AppData'
;

hive> msck repair table mytable;
OK
Partitions not in metastore:    mytable:country=India/year=2016/month=07/day=01 mytable:country=India/year=2016/month=07/day=02 mytable:country=US/year=2016/month=07/day=01
Repair: Added partition to metastore mytable:country=India/year=2016/month=07/day=01
Repair: Added partition to metastore mytable:country=India/year=2016/month=07/day=02
Repair: Added partition to metastore mytable:country=US/year=2016/month=07/day=01

hive> show partitions mytable;
OK
partition
country=India/year=2016/month=07/day=01
country=India/year=2016/month=07/day=02
country=US/year=2016/month=07/day=01

【讨论】:

感谢您的回答,它有所帮助,但问题是我有 2015 年至 2017 年每天的数据。我无法创建像 hdfs dfs -mkdir -p 这样的文件夹/AppData/country=India/year=2016/month=07/day=01 hdfs dfs -mkdir -p /AppData/country=India/year=2016/month=07/day=02 .......... ................................... hdfs dfs -mkdir -p /AppData/country=India/year= 2016/月=07/天=30 hdfs dfs -mkdir -p /AppData/country=India/year=2016/month=08/day=01 ........ ..................... 任何自动创建这些子文件夹的方法? 如何使用 bash 脚本重命名文件夹或使用 bash 脚本添加分区? 并排即时将此数据移动到 S3,因此无法在那里执行 shell 脚本 :(,这就是这里的问题。 (1) 根据 google 的说法,这似乎是可能的 (2) 您不必在 S3 上执行脚本,而是在当前数据上执行并生成一批 alter table ... add partition ... 命令 是否可以将这些分区查询为单个日期?还是所有查询都需要像 where day = 2 and month = 3 and year = 2016

以上是关于在 Hive 中为年、月和日创建表分区的主要内容,如果未能解决你的问题,请参考以下文章

如何生成hive的建表语句

如何生成hive的建表语句

hive建表语句

Hive 从文件名创建表分区

hive外部表分区

Hive分区与桶表