установить расположение раздела в запросе динамического раздела «Вставить перезапись» в кусте

Я создал таблицу кустов с базовым местоположением, указывающим на местоположение AWS S3. Однако я хочу создать раздел в кластере HDFS, используя запрос «Вставить перезапись».

Шаги ниже:

-- Create intermediate table
create table test_int_ash
( loc string)
partitioned by (name string, age int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
stored as textfile
location '/user/ash/test_int';

-- Insert into intermedate table with two names 'rash' and 'nash'
INSERT INTO test_int_ash partition (name="rash",age=20) values ('brisbane');
INSERT INTO test_int_ash partition (name="rash",age=30) values ('Sydney');
INSERT INTO test_int_ash partition (name="rash",age=40) values ('Melbourne');
INSERT INTO test_int_ash partition (name="rash",age=50) values ('Perth');

INSERT INTO test_int_ash partition (name="nash",age=50) values ('Auckland');
INSERT INTO test_int_ash partition (name="nash",age=40) values ('Wellington');


-- create curated table
create external table test_curated_ash
( loc string)
partitioned by (name string, age int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
stored as textfile
location 's3a://mybucket/tmp/test_curated/'; 

-- load curated table from intermedate table, using dynamic partition method, creates partitions on aws s3.
insert overwrite table test_curated_ash partition(name='rash',age)
select loc,age from test_int_ash where name='rash' ;

-- I want to keep this partition on HDFS cluster, below query doesnt work 

insert overwrite table test_curated_ash partition(name='nash',age) location 'hdfs://mynamenode/user/ash/test_curated_new'
select loc,age from test_int_ash where name='nash';

Ниже работает запрос, но я не хочу обрабатывать его с помощью метода «статического раздела».

alter table test_curated_ash add partition(name='nash',age=40) location 'hdfs://swmcdh1/user/contexti/ash/test_curated_new/name=nash/age=40';
alter table test_curated_ash add partition(name='nash',age=50) location 'hdfs://swmcdh1/user/contexti/ash/test_curated_new/name=nash/age=50';

insert overwrite table test_curated_ash partition(name='nash',age)
select loc,age from test_int_ash where name='nash'

Не могли бы вы помочь мне с тем, как установить местоположение раздела в динамическом запросе «Вставить перезапись»?


person Ash    schedule 31.05.2018    source источник


Ответы (2)


Предположим, у меня есть таблица с именем «пользователь», и я хочу динамически разделить ее, используя столбец страны.

Запрос :

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions=1000;
set hive.exec.max.dynamic.partitions.pernode=1000;

INSERT overwrite TABLE partitioned_user
    PARTITION (country)
        SELECT  firstname ,lastname,address,city,salary ,post,phone1,phone2,email,
        web,country FROM user;

При вставке данных в раздел необходимо включить столбцы раздела в качестве последних столбцов в запросе.

установить hive.exec.dynamic.partition.mode = нестрогий; если строго

В строгом режиме mapreduce (hive.mapred.mode=strict) выполнение некоторых рискованных запросов запрещено. Они включают:

  1. Декартово произведение.
  2. Раздел не выбирается для запроса.
  3. Сравнение bigints и строк.
  4. Сравнение бигинтов и двойников.
  5. Заказать без ограничений.

Согласно пунктам 2 и 5, мы не можем использовать операторы SELECT без хотя бы одного фильтра ключа раздела (например, WHERE country='US') или предложения ORDER BY без условия LIMIT для разделенных таблиц. Но по умолчанию для этого свойства задано значение nonstrict.

person Gaurav Varshney    schedule 31.05.2018
comment
Я ценю ваш ответ, но я ищу настройку местоположения раздела при выполнении «вставки перезаписи» с использованием метода динамического раздела. К сожалению, я не могу указать расположение раздела для кластера HDFS. Если вы прочтете мой код, вы поймете, что я пытаюсь сделать. - person Ash; 31.05.2018

Вы можете создать данные с разделами в HDFS, используя другую промежуточную таблицу.

Затем измените расположение разделов в итоговой таблице, чтобы они указывали на другое место, выполнив что-то вроде:

use dbname;ALTER TABLE table_name PARTITION (partname=value) SET LOCATION "местоположение";

Или вы можете напрямую обновить таблицу SDS метахранилища Hive для соответствующего SD_ID.

person Saurav Bhowmick    schedule 24.08.2018
comment
Привет, Саурав, надеюсь, ты правильно прочитал мой вопрос. Есть несколько динамических подразделов, и я не могу их жестко закодировать (в вашем примере partname=value). Если бы это был только один раздел столбца, это было бы легко, но из-за нескольких динамических подразделов я не могу этого сделать. В любом случае, я нашел альтернативу и вскоре напишу о ней в блоге. - Та - person Ash; 01.09.2018