我正在创建一个外部表,该表引用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外部表是否支持存储桶? 如果是,那么配置单元如何将外部文件夹中的数据重新分配到存储桶中?
答案 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。