0

根据文档,您应该能够为分区 Hive 外部表 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;返回记录!)

4

1 回答 1

0

也许我可以弄清楚 Hive 分区是如何工作的:

分区有两个组件:文件系统上的目录和 Hive 元存储中的条目。该条目本质上只是一对(分区值,分区位置)。

创建 Hive 表时,它在元存储中没有分区条目。

当您查询 Hive 时,它​​会检查元存储以查找需要查询的分区,然后扫描这些分区。

Hive 不会自动检测文件系统上的分区以添加元存储条目。

“动态分区”是指 Hive在插入分区的 Hive 表时基于数据列在文件系统和元存储中创建分区的能力,即执行实际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;

尽管我没有使用自定义分区模式测试后者。

于 2014-06-19T19:55:42.527 回答