gpt4 book ai didi

hadoop - 按现有字段分区 Hive 表?

转载 作者:可可西里 更新时间:2023-11-01 14:17:55 25 4
gpt4 key购买 nike

我可以在插入现有字段时对 Hive 表进行分区吗?

我有一个 10 GB 的文件,其中包含一个日期字段和一个小时字段。我可以将这个文件加载到一个表中,然后插入覆盖到另一个使用这些字段作为分区的分区表中吗?像下面这样的东西会起作用吗?

INSERT OVERWRITE TABLE tealeaf_event  PARTITION(dt=evt.datestring,hour=evt.hour) 
SELECT * FROM staging_event evt;

谢谢!

特拉维斯

最佳答案

我刚刚遇到这个问题,试图回答同样的问题,它很有帮助,但还不够完整。简短的回答是肯定的,问题中的查询之类的东西可以工作,但语法不太正确。

假设您有三个表,它们是使用以下语句创建的:

CREATE TABLE staging_unpartitioned (datestring string, hour int, a int, b int);

CREATE TABLE staging_partitioned (a int, b int)
PARTITIONED BY (datestring string, hour int);

CREATE TABLE production_partitioned (a int, b int)
PARTITIONED BY (dt string, hour int);

ab 只是一些示例列。 dthour 是我们想要在它到达生产表后进行分区的值。将暂存数据从 staging_unpartitionedstaging_partitioned 移动到生产环境看起来完全一样。

INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
SELECT a, b, datestring, hour FROM staging_unpartitioned;

INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
SELECT a, b, datestring, hour FROM staging_partitioned;

这使用称为动态分区的过程,您可以阅读有关 here 的信息.需要注意的重要一点是,哪些列与哪些分区相关联是由 SELECT 顺序决定的。所有动态分区必须最后按顺序选择。

当您尝试运行上面的代码时,您很可能会因设置的属性而出错。首先,如果您禁用了动态分区,它将无法工作,因此请确保:

set hive.exec.dynamic.partition=true;

如果您没有在动态分区之前至少在一个静态分区上进行分区,那么您可能会遇到错误。当您打算用动态分区覆盖其子分区时,此限制可以避免您意外删除根分区。根据我的经验,这种行为从来没有帮助,而且常常令人讨厌,但你的里程可能会有所不同。无论如何,很容易改变:

set hive.exec.dynamic.partition.mode=nonstrict;

那应该就可以了。

关于hadoop - 按现有字段分区 Hive 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6631464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com