繁体   English   中英

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

[英]How to add partition using hive by a specific date?

我正在使用配置单元(带外部表)来处理存储在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

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

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

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

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

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/';

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

s3://test.com/dt=2014-03-05

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

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

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

如果要使用日期字段进行分区,则需要s3文件夹结构,如下所述:

s3://test.com/date=2014-03-05/ip-foo-request-2014-03-05_04-20_00-49.log

在这种情况下,您可以创建具有分区列的外部表作为日期,并运行MSCK REPAIR TABLE EXTERNAL_TABLE_NAME以更新hive元存储。

请查看Carter Shanklin上面发布的回复。 您需要确保您的文件作为partitionkey = partitionvalue存储在目录结构中,即Hive默认情况下希望分区位于通过约定命名的子目录中。

在您的示例中,它应存储为

S3://test.com/date=20140305/ip-foo-request-2014-03-05_04-20_00-49.log。

要遵循的步骤:

i)确保上述结构中存在数据ii)创建外部表iii)现在运行msck修复表。

我认为数据存在于s3位置,并且可能未在元数据中更新(emrfs)。 为了使这首先工作,请执行emrfs导入和emrfs同步。 然后应用msck修复。

它将添加s3中存在的所有分区

如果您的现有目录结构不符合<partition name>=<partition value> ,则必须手动添加分区。 除非您像这样构建目录,否则MSCK REPAIR TABLE将无法工作。

在表创建时指定位置,如:

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/';

您可以添加分区而不指定完整路径:

ALTER TABLE test ADD PARTITION (dt='2014-03-05') LOCATION '2014-03-05';

虽然我从未检查过它,但我建议您将分区移动到存储桶内的文件夹中,而不是直接放在存储桶中。 例如,从s3://test.com/s3://test.com/data/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM