Вставка перезаписи на многораздельную таблицу не удаляет существующие данные - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь запустить перезапись вставки для многораздельной таблицы. Запрос выбора для вставки перезаписи полностью пропускает один раздел. Это ожидаемое поведение?

Определение таблицы

CREATE TABLE `cities_red`(                                                              
  `cityid` int,                                                                         
  `city` string)                                                                        
PARTITIONED BY (                                                                        
  `state` string)                                                                       
ROW FORMAT SERDE                                                                        
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde'                                           
STORED AS INPUTFORMAT                                                                   
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'                                     
OUTPUTFORMAT                                                                            
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'                                    
TBLPROPERTIES (                                                                         
  'auto.purge'='true',                                                                  
  'last_modified_time'='1555591782',                                                    
  'transient_lastDdlTime'='1555591782');  

Таблица данных

+--------------------+------------------+-------------------+--+
| cities_red.cityid  | cities_red.city  | cities_red.state  |
+--------------------+------------------+-------------------+--+
| 13                 | KARNAL           | HARYANA           |
| 13                 | KARNAL           | HARYANA           |
| 1                  | Nagpur           | MH                |
| 22                 | Mumbai           | MH                |
| 22                 | Mumbai           | MH                |
| 755                | BPL              | MP                |
| 755                | BPL              | MP                |
| 10                 | BANGLORE         | TN                |
| 10                 | BANGLORE         | TN                |
| 10                 | BANGLORE         | TN                |
| 10                 | BANGLORE         | TN                |
| 12                 | NOIDA            | UP                |
| 12                 | NOIDA            | UP                |
+--------------------+------------------+-------------------+--+

Запросы

insert overwrite table cities_red partition (state) select * from cities_red where city !='NOIDA';

Не удаляет данные из таблицы

insert overwrite table cities_red partition (state) select * from cities_red where city !='Mumbai';

Удаляет 2 ожидаемых строки из таблицы.

Это ожидаемое поведение от Hive в случае секционированных таблиц?

1 Ответ

1 голос
/ 19 апреля 2019

Да, это ожидаемое поведение.

Insert overwrite table partition select ,,, перезаписывает только те разделы, которые существуют в наборе данных, возвращенном select.

В вашем примере раздел state=UP содержит записи только с city='NOIDA'.Фильтр where city !='NOIDA' удаляет весь раздел state=UP из возвращенного набора данных, и поэтому он не перезаписывается.

Фильтр city !='Mumbai' не фильтрует весь раздел, он частично возвращается, поэтому он перезаписывается отфильтрованными данными.

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

И если вы все еще хотите удалить разделы и изменить данные в существующих разделах, то вы можете удалить / создать таблицу (вам может потребоваться создать одинболее промежуточную таблицу для этого), а затем загрузить разделы в него.Или альтернативно вычислите разделы, которые вам нужно отбросить отдельно, и выполните ALTER TABLE DROP PARTITION.

...