我有类似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对多个子目录运行查询并根据日期时间字符串对其进行切片?
为了使它正常工作,我必须做两件事:
SET mapred.input.dir.recursive=true; SET hive.mapred.supports.subdirectories=true;
ALTER TABLE search_input RECOVER PARTITIONS;
您可以使用:
SHOW PARTITIONS table;
检查并确认它们已被恢复。
我曾经遇到过同样的问题,并意识到配置单元没有分区元数据。因此,我们需要使用ALTER TABLE ADD PARTITION查询添加该元数据。如果您只有数百个分区来创建具有不同值的相同查询,这将变得很繁琐。
ALTER TABLE <table name> ADD PARTITION(<partitioned column name>=<partition value>);
一旦您在上述查询中针对所有可用分区运行。您应该在配置单元查询中看到结果。