假设我有一个包含TIMESTAMP列的Hive表,该列经常(几乎总是)包含在查询的WHERE子句中。通过TIMESTAMP字段对该表进行分区是有意义的;但是,为了保持合理的基数,按日分割是有意义的(而不是TIMESTAMP的最大分辨率)。
实现这一目标的最佳方法是什么?我应该创建一个额外的列(DATE)和分区吗?或者有没有办法在不创建重复列的情况下实现分区?
答案 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)
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
功能。