繁体   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