我可以在Hive外部表中创建存储桶吗?

时间:2020-07-30 12:26:07

标签: hadoop hive hiveql bucket hadoop-partitioning

我正在创建一个外部表,该表引用HDFS位置中的ORC文件。 ORC文件的存储方式是按日期对外部表进行分区(将HDFS上的日期明智的文件夹映射为分区)。 但是,我想知道是否可以对这些外部表强制执行“ Bucketing”,因为基础数据/文件不是由配置单元“管理”的。它们是在外部编写的,因此可以在Hive外部表中使用存储桶吗?

Hive允许我在创建外部表时使用'CLUSTERED BY'子句。但是我不明白如何配置单元将数据重新分配到存储桶中,HDFS上已经将哪些内容作为ORC文件写入了

我在此处的外部表中看到了关于分区和分组的类似问题:

Hive: Does hive support partitioning and bucketing while usiing external tables

Can I cluster by/bucket a table created via "CREATE TABLE AS SELECT....." in Hive?

,但是答案仅是关于外部表中的分区支持或MANAGED表中的存储桶支持。我知道这两个选项,并且已经在使用它,但是需要有关Hive EXTERNAL表中的存储桶支持的具体答案。

因此,总而言之,Hive外部表是否支持存储桶? 如果是,那么配置单元如何将外部文件夹中的数据重新分配到存储桶中?

1 个答案:

答案 0 :(得分:2)

是的,Hive确实支持外部表的存储和分区。

只需尝试:

SET hive.tez.bucket.pruning=true;
SET hive.optimize.sort.dynamic.partition=true;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.enforce.bucketing = true;

drop table stg.test_v1;
create external table stg.test_v1 
(
       id bigint
      ,name string
)
partitioned by (created_date string)
CLUSTERED BY(name) INTO 3 BUCKETS
stored as ORC
;

INSERT OVERWRITE TABLE stg.test_v1 partition(created_date)
SELECT 
      id, name, created_date
FROM
(select stack(3, 
             1, 'Valeriy', '2020-01-01',
             2, 'Victor', '2020-01-01',
             3, 'Ankit', '2020-01-01'
             ) as(id, name, created_date)
)s;

DESC FORMATTED说:

Table Type:          EXTERNAL_TABLE 
...
Num Buckets:         3                     
Bucket Columns:      [name] 

加载更多行,您会看到,它将为每个分区创建3个文件

另请参阅本文档,以获取有关托管表和外部表支持的功能的更多详细信息:Managed vs External Tables