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