根据文档,您应该能够为分区指定自定义模式
Hive external tables partitions。但是,我无法让它工作:
select * from rawlog_test7 limit 10;
不返回任何记录。
这就是我正在做的事情
set hcat.dynamic.partitioning.custom.pattern="${year}/${month}/${day}/${hour}"
我创建了我的表 ......
partitioned by (year int, month int, day int, hour int)
location '/history.eu1/ed_reports/hourly/';
我的目录结构是../2014/06/18/13/ ...
如果我使用静态分区
alter table rawlog_test7 add partition (year=2014,month=6,day=18,hour=13) location '/history.eu1/ed_reports/hourly/2014/06/18/13';
它有效(select * from rawlog_test7 limit 10;
返回记录!)
答案 0 :(得分:0)
也许我可以清楚一些关于Hive分区如何工作的事情:
分区有两个组件:文件系统上的目录,以及Hive的Metastore中的条目。此条目基本上只是一对(分区值,分区位置)。
创建Hive表时,它在Metastore中没有分区条目。
当您查询Hive时,它会检查Metastore中需要查询的分区,然后扫描它们。
Hive不会自动检测文件系统上的分区以添加Metastore条目。
"动态分区"指的是Hive能够在插入分区的Hive表时基于数据列在文件系统和Metastore中创建分区,即执行实际的insert into table rawlog_test7 partition(y,m,d,h) ...
命令。
如果文件系统中的目录还没有Metastore条目,您可以像往常一样逐个添加它们:
alter table rawlog_test7 add partition (year=2014,month=6,day=18,hour=13) location '/history.eu1/ed_reports/hourly/2014/06/18/13';
或者你可以运行表修复:
msck repair table rawlog_test7;
虽然我没有使用自定义分区模式测试后者。