如何在特定日期使用配置单元添加分区?

bri*_*isk 15 hadoop hive amazon-s3

我正在使用配置单元(带外部表)来处理存储在amazon S3上的数据.

我的数据分区如下:

                       DIR   s3://test.com/2014-03-01/
                       DIR   s3://test.com/2014-03-02/
                       DIR   s3://test.com/2014-03-03/
                       DIR   s3://test.com/2014-03-04/
                       DIR   s3://test.com/2014-03-05/

s3://test.com/2014-03-05/ip-foo-request-2014-03-05_04-20_00-49.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_06-26_19-56.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_15-20_12-53.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_22-54_27-19.log
Run Code Online (Sandbox Code Playgroud)

如何使用配置单元创建分区表?

   CREATE EXTERNAL TABLE test (
    foo string,
    time string,
    bar string
    )  PARTITIONED BY (? string)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\t'
    LOCATION 's3://test.com/';
Run Code Online (Sandbox Code Playgroud)

有人可以回答这个问题吗?谢谢!

小智 40

首先从正确的表定义开始.在你的情况下,我只会使用你写的:

CREATE EXTERNAL TABLE test (
    foo string,
    time string,
    bar string
)  PARTITIONED BY (dt string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION 's3://test.com/';
Run Code Online (Sandbox Code Playgroud)

Hive默认情况下希望分区位于通过约定s3://test.com/partitionkey=partitionvalue命名的子目录中.例如

s3://test.com/dt=2014-03-05
Run Code Online (Sandbox Code Playgroud)

如果遵循此约定,则可以使用MSCK添加所有分区.

如果您不能或不想使用此命名约定,则需要添加所有分区,如下所示:

ALTER TABLE test
    ADD PARTITION (dt='2014-03-05')
    location 's3://test.com/2014-03-05'
Run Code Online (Sandbox Code Playgroud)