假设我有一个Hive表,其中包含一个时间戳列,该列经常(几乎总是)包含在查询的WHERE子句中。用时间戳字段来划分这个表是有意义的;但是,为了保持合理的基数,每天进行分区是有意义的(而不是根据时间戳的最大分辨率)。
实现这一目标的最佳方法是什么?我应该在上面创建一个额外的列(日期)和分区吗?还是有一种方法可以实现分区而不创建重复的列?
发布于 2017-02-03 16:46:11
它不是新列,而是伪列,您应该通过添加分区规范来重新创建表,如下所示:
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分区只是一个子目录,而不是一个真正的列,因此它不会只影响表的总大小几千字节。
发布于 2017-02-03 00:54:26
由于分区也是单元中的列之一,每个分区都有值(使用静态或动态分区赋值),每个分区都映射到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函数。
https://stackoverflow.com/questions/42014596
复制相似问题