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

时间:2014-08-04 20:47:53

标签: amazon-s3 hive

我将数据存储在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
...

我的理解是,如果我通过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/';

然而,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';

我可以很好地查询数据。

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

2 个答案:

答案 0 :(得分:6)

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

  1. 启用递归目录支持:
  2. SET mapred.input.dir.recursive=true;
    SET hive.mapred.supports.subdirectories=true;
    
    1. 由于某种原因,它仍然无法识别我的分区,因此我必须通过以下方式恢复它们:
    2. ALTER TABLE search_input RECOVER PARTITIONS;
      

      您可以使用:

      SHOW PARTITIONS table;
      

      检查并发现它们已被恢复。

答案 1 :(得分:0)

我曾经遇到过同样的问题,并且意识到配置单元没有分区元数据。因此,我们需要使用ALTER TABLE ADD PARTITION查询添加该元数据。如果您只有几百个分区来创建具有不同值的相同查询,这将变得很繁琐。

ALTER TABLE <table name> ADD PARTITION(<partitioned column name>=<partition value>);

一旦在上面的查询中运行了所有可用分区。您应该在配置单元查询中看到结果。