我可以在 Hive External Table 中创建存储桶吗?

Can I create buckets in a Hive External Table?

我正在创建一个引用 HDFS 位置中的 ORC 文件的外部 table。 ORC 文件的存储方式是外部 table 按日期分区(映射到 HDFS 上的日期明智的文件夹,作为分区)。 但是,我想知道我是否可以在这些外部 table 上强制执行 'Bucketing',因为底层的 data/files 不是 'managed' by hive。它们是在外部编写的,因此可以在 Hive 外部表中使用分桶吗?

Hive 允许我在创建外部 table 时使用 'CLUSTERED BY' 子句。但是我无法理解 hive 如何将数据重新分配到桶中,HDFS 上已经作为 ORC 文件写入了什么?

我在此处的外部 table 中看到了有关 PARTITION AND BUCKETING 的类似问题:

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?

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

中的分桶支持的具体答案

所以,总而言之,Hive 外部表是否支持分桶? 如果是,hive如何将外部文件夹中的数据重新分配到桶中?

是的,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