我可以在 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。
我正在创建一个引用 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。