Могу ли я создавать сегменты во внешней таблице Hive?

Я создаю внешнюю таблицу, которая ссылается на файлы ORC в расположении HDFS. Файлы ORC хранятся таким образом, что внешняя таблица разбивается на разделы по дате (Сопоставление папок по дате в HDFS как разделы). Однако мне интересно, могу ли я применить «Bucketing» к этим внешним таблицам, потому что базовые данные / файлы не «управляются» кустом. Они написаны для внешнего использования, поэтому можно ли использовать ведение во внешних таблицах Hive?

Hive позволяет мне использовать предложение CLUSTERED BY при создании внешней таблицы. Но я не могу понять, как hive будет перераспределять данные по корзинам, что уже записано на HDFS в виде файлов ORC?

Я видел похожие вопросы по РАЗДЕЛАМ И ВЕДОМОМУ во внешних таблицах здесь:

Улей: поддерживает ли улей разбиение на разделы и ведение при использовании внешние таблицы

а также

Могу ли я кластеризовать по / bucket таблицу, созданную с помощью CREATE TABLE AS SELECT ..... в Hive?

но ответы говорят только о поддержке разделов во внешних таблицах или поддержке ведра в УПРАВЛЯЕМЫХ таблицах. Мне известны оба этих варианта, и я уже использую их, но мне нужны конкретные ответы о поддержке сегментирования в таблицах Hive EXTERNAL.

Итак, в целом, поддерживают ли внешние таблицы Hive ведение? Если да, то как данные во внешней папке перераспределяются в сегменты по улью?


person Sai Geetha M N    schedule 30.07.2020    source источник


Ответы (1)


Да, 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 файла на раздел

См. Также эту документацию для получения дополнительных сведений о функциях, поддерживаемых для управляемых и внешних таблиц: Управляемые и внешние таблицы.

person leftjoin    schedule 31.07.2020
comment
Спасибо leftjoin за этот ответ. Я только что попробовал то же самое прямо сейчас и понял, что это возможно. пришел, чтобы ответить на мой собственный вопрос и увидел это :) Я также понял, что мы должны использовать INSERT OVERWRITE, чтобы воспользоваться функцией сегментирования. Если я создаю внешнюю таблицу поверх существующих данных, таблица даже не распознает данные !! Только если я выполняю перезапись вставкой, данные копируются в целевую папку и читаются таблицей с разделениями. - person Sai Geetha M N; 31.07.2020
comment
msck repair table также должен работать в случае создания таблицы по существующим данным. - person wypul; 14.11.2020