簡體   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