Вставка куста перезаписывает таблицу в некоторых случаях - PullRequest
0 голосов
/ 31 мая 2018

Я работал над одним решением и обнаружил, что в некоторых конкретных случаях куст insert overwrite усекает таблицу, но в некоторых случаях это не так.Кто-нибудь, пожалуйста, объясните мне, как он себя ведет?

, чтобы объяснить это, у меня две таблицы, source и target , и я пытаюсь вставить данные в мастер изисходная таблица с использованием insert overwrite

Когда в исходной таблице есть раздел

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

create table source (name String) partitioned by (age int);
insert into source partition (age) values("gaurang", 11);
create table target (name String, age int);
insert into target partition (age) values("xxx", 99);

следующий запрос не будет усекать таблицу, даже если select ничего не возвращает.

insert overwrite  table temp.test12 select * from temp.test11 where name="Ddddd" and age=99;

Однако следующий запрос будет урезать таблицу .

insert overwrite  table temp.target select * from temp.test11 where name="Ddddd" and age=11;

это имеет смысл в первом случае, так как раздел (age = 99) не существует, поэтому он должен прекратить выполнение запроса в дальнейшем.Однако это мое предположение, не уверен, что именно происходит.

Когда в исходной таблице нет раздела, но в Target есть , в этом случае таблица назначения не будет усечена, даже если оператор select из исходной таблицы возвращает 0 строк.

use temp;
drop table if exists source1;
drop table if exists target1;
create table source1 (name String, age int);
create table target1 (name String) partitioned by (age int);
insert into source1 values ("gaurang", 11);
insert into target1 partition(age) values("xxx", 99);
select  * from source1;
select * from target1;

Следующий запрос не будет усекать таблицу, даже если в операторе выбора не найдены данные.

insert overwrite table temp.target1 partition(age) select * from temp.source1 where age=90;

Когда у источника или цели нет раздела

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

use temp;
drop table if exists source1;
drop table if exists target1;
create table source1 (name String, age int);
create table target1 (name String, age int);
insert into source1 values ("gaurang", 11);
insert into target1 values("xxx", 99);
select  * from source1;
select * from target1;

После запроса будет обрезать целевую таблицу.

   insert overwrite table temp.target1 select * from temp.source1 where age=90;

1 Ответ

0 голосов
/ 01 июня 2018

Лучше использовать термин 'overwrite' вместо truncate, потому что именно это происходит во время insert overwrite.

Когда вы пишете overwrite table temp.target1 partition(age), вы указываете Hive перезаписывать разделы, а не все таблицы target1., только те разделы, которые будут возвращены с помощью select.

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

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

Столбец разбиения в операторе insert overwrite должен быть последним.И список разделов, которые должны быть перезаписаны в target = список значений в столбце раздела, возвращаемый набором данных, не имеет значения, как разбивается исходная таблица (вы можете выбрать целевой столбец раздела из любого столбца исходной таблицы, вычислить его или использовать константу) имеет значение только то, что было возвращено.

...