[英]How can I partition a hive table by (only) a portion of a timestamp column?
假設我有一個包含TIMESTAMP列的Hive表,該列經常(幾乎總是)包含在查詢的WHERE子句中。 通過TIMESTAMP字段對該表進行分區是有意義的; 但是,為了保持合理的基數,按日分區是有意義的(而不是TIMESTAMP的最大分辨率)。
實現這一目標的最佳方法是什么? 我應該創建一個額外的列(DATE)和分區嗎? 或者有沒有辦法實現分區而不創建重復列?
它不是一個新列,而是一個偽列,你應該重新創建你的表,添加如下的分區規范:
create table table_name (
id int,
name string,
timestamp string
)
partitioned by (date string)
然后像這樣動態加載創建分區的數據
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
FROM table_name_old tno
INSERT OVERWRITE TABLE table_name PARTITION(substring(timestamp,0,10))
SELECT tno.id, tno.name, tno.timestamp;
現在,如果從表中選擇all,您將看到該分區的新列,但考慮到Hive分區只是一個子目錄而不是真正的列,因此它不會影響總表大小僅為幾千字節。
由於分區也是配置單元中的列之一,因此每個分區都有值(使用靜態或動態分區分配),並且每個分區都映射到HDFS中的目錄,因此它必須是附加列。
您可以選擇以下選項之一:
我們說表DDL:
CREATE TABLE temp( id string) PARTITIONED BY (day int)
ALTER TABLE xyz ADD PARTITION (day=00) location '/2017/02/02';
要么
INSERT OVERWRITE TABLE xyz PARTITION (day=1) SELECT id FROM temp WHERE dayOfTheYear(**timestamp**)=1;
INSERT INTO TABLE xyz PARTITION (day) SELECT id , dayOfTheYear(day) FROM temp;
Hive沒有任何dayOfTheYear
功能你創建它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.