簡體   English   中英

如何通過(僅)時間戳列的一部分對hive表進行分區?

[英]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)

  1. 如果數據按日組織,則添加靜態分區:

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;

  1. 使用動態分區生成日期編號:

INSERT INTO TABLE xyz PARTITION (day) SELECT id , dayOfTheYear(day) FROM temp;

Hive沒有任何dayOfTheYear功能你創建它。

暫無
暫無

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

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