我正在创建一个引用HDFS位置中的ORC文件的外部表。ORC文件的存储方式是按照日期对外部表进行分区(映射到HDFS上的date wise文件夹,作为分区)。然而,我想知道我是否可以在这些外部表上强制'Bucketing‘,因为底层数据/文件不是由hive’管理‘的。它们是在外部编写的,因此可以在Hive外部表中使用bucketing吗?
配置单元允许我在创建外部表时使用'CLUSTERED BY‘子句。但我不能理解hive如何将数据重新分配到存储桶中,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?
但答案是只讨论外部表中的分区支持或托管表中的存储桶支持。我知道这两个选项,并已经在使用它,但需要关于Hive外部表中的bucketing支持的具体答案。
那么,总而言之,Hive外部表是否支持分组表?如果是,配置单元如何将外部文件夹中的数据重新分配到存储桶中?
发布于 2020-07-31 18:25:16
是的,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。
https://stackoverflow.com/questions/63173151
复制相似问题