Вложение статического раздела в динамический раздел

#hive #mapreduce #hive-partitions

#улей #mapreduce #улей-разделы

Вопрос:

Почему в Hive мне не разрешено вставлять статический раздел в динамический раздел?

например, разрешено следующее

 INSERT OVERWRITE TABLE T PARTITION (ds='2010-03-03', hr)
SELECT key, value, /*ds,*/ hr FROM srcpart WHERE ds is not null and hr>10;
 

но это не разрешено

 INSERT OVERWRITE TABLE T PARTITION (ds, hr = 11)
SELECT key, value, ds/*, hr*/ FROM srcpart WHERE ds is not null and hr=11;
 

Я нахожу официальное объяснение страницы wiki (показано ниже) недостаточным. Предпочитайте логическое объяснение или объяснение на базовом уровне map-reduce.

 SP is a subpartition of a DP: should throw an error because partition column order determins directory hierarchy. We cannot change the hierarchy in DML
 

Комментарии:

1. В качестве оптимизации статический раздел будет создан заранее, а не во время @ runtime. следовательно, ваш (ds, hr = 11) не будет работать, потому что родительский каталог является динамическим.

Ответ №1:

Это проблема с дизайном улья (указана здесь):

Если имеется несколько столбцов разделов, их порядок имеет значение, поскольку это соответствует структуре каталогов в HDFS: partitioned by (ds string, dept int) подразумевает структуру каталогов ds=2009-02-26/dept=2 .

В DML или DDL, использующих секционированную таблицу, если указано подмножество столбцов секционирования (статическое), мы должны выдать ошибку, если динамический столбец секционирования ниже.

Пример:

 create table nzhang_part(a string) partitioned by (ds string, dept int);
insert overwrite nzhang_part (dept=1)
  select a, ds, dept from T
  where dept=1 and ds is not null;