根据S3目录名自动分区Hive表

gal*_*ine 5 hive amazon-s3

我有数据存储在S3中,如:

/bucket/date=20140701/file1
/bucket/date=20140701/file2
...
/bucket/date=20140701/fileN

/bucket/date=20140702/file1
/bucket/date=20140702/file2
...
/bucket/date=20140702/fileN
...
Run Code Online (Sandbox Code Playgroud)

我的理解是,如果我通过Hive引入该数据,它将自动解释date为分区.我的表创建如下:

CREATE EXTERNAL TABLE search_input(
   col 1 STRING,
   col 2 STRING,
   ...

)
PARTITIONED BY(date STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
LOCATION 's3n://bucket/';
Run Code Online (Sandbox Code Playgroud)

但是,Hive无法识别任何数据.我运行的任何查询返回0结果.如果我只是通过以下方式获取其中一个日期:

CREATE EXTERNAL TABLE search_input_20140701(
   col 1 STRING,
   col 2 STRING,
   ...

)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
LOCATION 's3n://bucket/date=20140701';
Run Code Online (Sandbox Code Playgroud)

我可以很好地查询数据.

为什么Hive不能识别带有"date = date_str"分区的嵌套目录?有没有更好的方法让Hive在多个子目录上运行查询并根据日期时间字符串对其进行切片?

gal*_*ine 6

为了使这个工作,我必须做两件事:

  1. 启用递归目录支持:
SET mapred.input.dir.recursive=true;
SET hive.mapred.supports.subdirectories=true;
Run Code Online (Sandbox Code Playgroud)
  1. 由于某种原因,它仍然无法识别我的分区,所以我不得不通过以下方式恢复它们:
ALTER TABLE search_input RECOVER PARTITIONS;
Run Code Online (Sandbox Code Playgroud)

您可以使用:

SHOW PARTITIONS table;
Run Code Online (Sandbox Code Playgroud)

检查并发现他们已经康复.