我可以在hive外部表中创建bucket吗?

b4qexyjb  于 2021-05-31  发布在  Hadoop
关注(0)|答案(1)|浏览(475)

我正在创建一个外部表,它引用hdfs位置中的orc文件。orc文件以这样一种方式存储:外部表按日期分区(Map到hdfs上的按日期的文件夹,作为分区)。但是,我想知道是否可以对这些外部表强制执行“bucketing”,因为底层数据/文件不是由hive“管理”的。它们是在外部编写的,因此可以在配置单元外部表中使用bucketing吗?
hive允许我在创建外部表时使用'clustered by'子句。但我无法理解hive将如何将数据重新分配到存储桶中,hdfs上已经作为orc文件写入的内容是什么?
我在这里看到过关于外部表中分区和bucketing的类似问题:
配置单元:在使用外部表时,配置单元是否支持分区和bucketing

我可以按/bucket对通过hive中的“create table as select…”创建的表进行集群吗?
但答案只涉及外部表中的分区支持或托管表中的bucket支持。我知道这两个选项,并已在使用它,但需要具体的答案,对bucketing支持在Hive外部表。
总之,配置单元外部表支持bucketing吗?如果是,外部文件夹中的数据如何通过配置单元重新分配到存储桶中?

6l7fqoea

6l7fqoea1#

是的,hive确实支持外部表的bucketing和分区。
试试看:

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;

描述说:

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

加载更多行,您将看到,它将为每个分区创建3个文件
有关托管表和外部表支持的功能的更多详细信息,请参见本文档:托管表与外部表。

相关问题