【问题标题】:automatically partition Hive tables based on S3 directory names根据 S3 目录名称自动分区 Hive 表
【发布时间】:2020-06-03 11:37:16
【问题描述】:

我将数据存储在 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 对多个子目录运行查询并根据日期时间字符串对其进行切片?

【问题讨论】:

    标签: amazon-s3 hive


    【解决方案1】:

    为了让它发挥作用,我必须做两件事:

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

    你可以使用:

    SHOW PARTITIONS table;
    

    检查并查看它们是否已被恢复。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,并意识到 hive 没有分区元数据。所以我们需要使用 ALTER TABLE ADD PARTITION 查询来添加元数据。如果您有几百个分区来创建具有不同值的相同查询,这将变得乏味。

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

      一旦您对所有可用分区运行上述查询。您应该会在 hive 查询中看到结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-24
        • 1970-01-01
        • 2019-07-08
        • 1970-01-01
        • 2020-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多