如何通过(仅)时间戳列的一部分对hive表进行分区?

时间:2017-02-03 00:03:37

标签: hadoop hive hortonworks-data-platform

假设我有一个包含TIMESTAMP列的Hive表,该列经常(几乎总是)包含在查询的WHERE子句中。通过TIMESTAMP字段对该表进行分区是有意义的;但是,为了保持合理的基数,按日分割是有意义的(而不是TIMESTAMP的最大分辨率)。

实现这一目标的最佳方法是什么?我应该创建一个额外的列(DATE)和分区吗?或者有没有办法在不创建重复列的情况下实现分区?

2 个答案:

答案 0 :(得分:3)

它不是一个新列,但它是一个伪列,你应该重新创建你的表,添加如下的分区规范:

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分区只是一个子目录而不是真正的列,因此它不会影响总表大小千字节。

答案 1 :(得分:0)

由于分区也是hive中的列之一,每个分区都有值(使用静态或动态分区分配),每个分区都映射到HDFS中的目录,因此它必须是附加列。

您可以选择以下选项之一:

让我们说表DDL:

CREATE TABLE temp( id string) PARTITIONED BY (day int)

  1. 如果数据按日组织,则添加静态分区:
  2. 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. 使用动态分区生成日期编号:
    2. INSERT INTO TABLE xyz PARTITION (day) SELECT id , dayOfTheYear(day) FROM temp;

      Hive没有您创建的任何dayOfTheYear功能。