Задать расположение раздела в запросе динамического раздела «Вставить перезапись» - PullRequest
0 голосов
/ 31 мая 2018

Я создал таблицу улья с базовым местоположением, указывающим на местоположение 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'

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

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

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

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

используйте dbname; ALTER TABLE table_name PARTITION (partname = значение) SET LOCATION "location";

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

0 голосов
/ 31 мая 2018

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

Запрос:

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;

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

set hive.exec.dynamic.partition.mode = nonstrict;если строгий

В строгом режиме mapreduce (hive.mapred.mode = строгий) некоторые рискованные запросы не разрешаются для выполнения.Они включают в себя:

  1. декартово произведение.
  2. Не выбрано ни одного раздела для запроса.
  3. Сравнение bigints и строк.
  4. Сравнение bigints иудваивается.
  5. Orderby без ограничения.

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

...