в таблицу Hive — неразделенная таблица в многораздельную таблицу с несколькими разделами — невозможно вставить в целевую таблицу из-за номера/типа столбца

Когда я попытался вставить в разделенную таблицу, я получаю следующую ошибку:

SemanticException [Ошибка 10044]: Строка 1:23 Невозможно вставить в целевую таблицу, потому что номера/типы столбцов разные: Таблица insclause-0 имеет 6 столбцов, а 3 столбца разделены, и нам не требуются какие-либо фильтры, которые мы должны выгружать/сохранять. несекционированная таблица в секционированную таблицу.

Моя таблица:

Источник:

id name   salary dep
1  sai    1000   sales
2  syam   2000   hr
3  sundar 3000   bank

Цель:

id name   salary dep
1  sai    1000   sales
2  syam   2000   hr
3  sundar 3000   bank

раздел (строка имени, строка dep)

Пожалуйста, дайте мне, как скопировать из источника в цель

попробовал ниже.

insert into target_partitioned_table partition(name,dep) select id from source_table;

person developer123    schedule 07.01.2021    source источник


Ответы (1)


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

Проверьте таблицу DDL. Если он разделен по Имени и Деп, то столбцы раздела должны быть последними: id, salary, name, dep. Если столбцы упорядочены, как в вашем вопросе, это не похоже на то, что таблица разбита на разделы (Имя, Деп), или порядок столбцов в файле или в вашем примере данных неверен. Вставьте столбцы в том же порядке, в котором возвращает команда DESCRIBE.

Запрос должен содержать все столбцы в точно таком же порядке.

Для загрузки статического раздела вам не нужны столбцы раздела в выборе, значения являются статическими в спецификации раздела:

insert into table target_partitioned_table partition(name='Some Name',dep='Sales')
select id, salary from source_table;

Для динамической загрузки разделов (разделы берутся из набора данных и должны быть в выборке в том же порядке):

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

insert into table target_partitioned_table partition(name,dep)
select id, salary, name, dep from source_table;
person leftjoin    schedule 07.01.2021