簡體   English   中英

按現有字段分區 Hive 表?

[英]Partition Hive table by existing field?

我可以在通過現有字段插入時對 Hive 表進行分區嗎?

我有一個 10 GB 的文件,其中包含一個日期字段和一個小時字段。 我可以將此文件加載到表中,然后插入覆蓋到另一個使用這些字段作為分區的分區表中嗎? 會像以下工作嗎?

INSERT OVERWRITE TABLE tealeaf_event  PARTITION(dt=evt.datestring,hour=evt.hour) 
SELECT * FROM staging_event evt;

謝謝!

特拉維斯

我剛剛遇到這個試圖回答同樣的問題,它很有幫助,但並不完整。 簡短的回答是肯定的,類似問題中的查詢會起作用,但語法不太正確。

假設您有三個使用以下語句創建的表:

CREATE TABLE staging_unpartitioned (datestring string, hour int, a int, b int);

CREATE TABLE staging_partitioned (a int, b int) 
    PARTITIONED BY (datestring string, hour int);

CREATE TABLE production_partitioned (a int, b int) 
    PARTITIONED BY (dt string, hour int);

a列和b列只是一些示例列。 dthour是我們想要在它到達生產表后對其進行分區的值。 將 staging 數據從staging_unpartitionedstaging_partitioned移至生產環境看起來完全一樣。

INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
    SELECT a, b, datestring, hour FROM staging_unpartitioned;

INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
    SELECT a, b, datestring, hour FROM staging_partitioned;

這使用了一個稱為動態分區的過程,您可以在此處閱讀。 需要注意的重要一點是,哪些列與哪些分區相關聯是由 SELECT 順序決定的。 所有動態分區必須按順序最后選擇。

當您嘗試運行上面的代碼時,很有可能會因為您設置的屬性而遇到錯誤。 首先,如果您禁用了動態分區,它將無法工作,因此請確保:

set hive.exec.dynamic.partition=true;

如果您在動態分區之前沒有在至少一個 static 分區上進行分區,那么您可能會遇到錯誤。 當您打算用動態分區覆蓋其子分區時,此限制將避免您意外刪除根分區。 以我的經驗,這種行為從來沒有幫助過,而且經常很煩人,但你的里程可能會有所不同。 無論如何,很容易改變:

set hive.exec.dynamic.partition.mode=nonstrict;

那應該這樣做。

也許這已經被回答了......但是是的,你可以完全按照你所說的去做。 我已經做過很多次了。 顯然,您的新表需要與原始表類似地定義,但沒有分區列,並且具有分區規范。 另外,我不記得是否必須明確列出原始表中的列,或者星號是否足夠。

我對此不太確定,但這樣的事情可能會奏效

INSERT OVERWRITE TABLE tealeaf_event
SELECT col1 as tealeaf_col1, ..., datestring as ds;

不可以。您必須刪除該字段,或者至少重命名它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM