繁体   English   中英

Apache Hive 使用 alter table 语句添加 TIMESTAMP 分区

[英]Apache Hive Add TIMESTAMP partition using alter table statement

加载数据后,我目前正在为我的所有表运行MSCK HIVE REPAIR SCHEMA.TABLENAME

随着分区的增长,对于一个表,此语句需要更长的时间(有时超过 5 分钟)。 我知道它会扫描和解析 s3 中的所有分区(我的数据所在的位置),然后将最新的分区添加到 hive 元存储中。

我想用ALTER TABLE ADD PARTITION语句替换MSCK REPAIR MSCK REPAIR在添加最新分区时效果很好,但是在使用ALTER TABLE ADD PARTITION时,我遇到了分区中TIMESTAMP值的问题。

我有一个有四个分区的表(part_dt STRING, part_src STRING, part_src_file STRING, part_ldts TIMESTAMP)

运行 **MSCK REPAIR 后,SHOW PARTITIONS 命令在 output 下面给出了我

hive> show partitions hub_cont;
OK
part_dt=20181016/part_src=asfs/part_src_file=kjui/part_ldts=2019-05-02 06%3A30%3A39

但是,当我从 Metastore 中删除上述分区并使用 ALTER TABLE ADD PARTITION 重新创建它时

hive> alter table hub_cont add partition(part_dt='20181016',part_src='asfs',part_src_file='kjui',part_ldts='2019-05-02 06:30:39');
OK
Time taken: 1.595 seconds
hive> show partitions hub_cont;
OK
part_dt=20181016/part_src=asfs/part_src_file=kjui/part_ldts=2019-05-02 06%3A30%3A39.0
Time taken: 0.128 seconds, Fetched: 1 row(s)

它在时间戳值的末尾添加.0 当我查询该分区的表时,它给了我 0 条记录。

有没有办法添加具有时间戳值的分区而不在最后添加这个零。 我无法弄清楚 MSCK REPAIR 如何处理这种 ALTER TABLE 语句无法处理的情况。

如果您插入动态分区,也会发生同样的情况,它将使用.0 创建新分区,因为默认时间戳字符串表示格式包括毫秒部分, REPAIR TABLE找到新文件夹并将分区添加到元存储并且也可以正常工作,因为没有毫秒的时间戳字符串相当与时间戳兼容...

解决方案是使用STRING而不是TIMESTAMP并明确删除毫秒。

但首先请仔细检查您在单个分区中确实有数百万行并且确实需要时间戳粒度分区,而不是 DATE,并且此分区列非常重要(例如,如果它在功能上依赖于另一个分区列 part_src_file,您完全可以摆脱它)。 分区过多会导致性能下降。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM