首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过(仅)时间戳列的一部分来划分一个单元格表?

如何通过(仅)时间戳列的一部分来划分一个单元格表?
EN

Stack Overflow用户
提问于 2017-02-03 00:03:36
回答 2查看 3.5K关注 0票数 7

假设我有一个Hive表,其中包含一个时间戳列,该列经常(几乎总是)包含在查询的WHERE子句中。用时间戳字段来划分这个表是有意义的;但是,为了保持合理的基数,每天进行分区是有意义的(而不是根据时间戳的最大分辨率)。

实现这一目标的最佳方法是什么?我应该在上面创建一个额外的列(日期)和分区吗?还是有一种方法可以实现分区而不创建重复的列?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-03 16:46:11

它不是新列,而是伪列,您应该通过添加分区规范来重新创建表,如下所示:

代码语言:javascript
复制
create table table_name (
  id                int,
  name              string,
  timestamp         string
)
partitioned by (date string)

然后加载数据,动态创建分区,如下所示

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

票数 6
EN

Stack Overflow用户

发布于 2017-02-03 00:54:26

由于分区也是单元中的列之一,每个分区都有值(使用静态或动态分区赋值),每个分区都映射到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函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42014596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档