2015-07-17 1 views
4

У меня есть таблица, которая имеет раздел типа int, но который я хочу преобразовать в строку. Однако я не могу понять, как это сделать.Hive 1.1.0 Измените тип раздела таблицы из int в строку

Описание таблицы:

Col1 timestamp 
Col2 string 
Col3 string 
Col4 string 
Part_col int 

# Partition information 
# col_name data_type comment 

Part_col int 

Перегородки Я создаваемые Part_col = 0, Part_col = 1, ..., Part_col = 23

Я хочу изменить их Part_col =» 0' и т.д.

я запустить эту команду в улье:

set hive.exec.dynamic.partitions = true; 
Alter table tbl_name partition (Part_col=0) Part_col Part_col string; 

Я также попытался с помощью «Partit ion (Part_col) ", чтобы сразу изменить все разделы.

я получаю ошибку «Недопустимая ссылка на столбец Part_col»

Я использую пример из https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types для преобразования десятичных столбцов, но не могу понять, что dec_column_name представляет.

Благодаря

ответ

9

Немного рытье показал, что существует улей JIRA иметь команду именно для обновления типа раздела колонки данных (https://issues.apache.org/jira/browse/HIVE-3672)

alter table {table_name} partition column ({column_name} {column_type}); 

Согласно JIRA команда была реализована, но это очевидно, что он никогда не был документирован в Hive Wiki.

Я использовал его на своей системе Hive 0.14 и работал, как ожидалось.

+0

Это сработало. Спасибо! – mankand007

-1

Я думаю, что года должны пересмотреть Схему таблицы и переопределить, что ваша ценность раздела не собирается быть целым числа больше, и теперь это собирается быть строковым типом.

То, что я рекомендую вам сделать это:

  1. Сделайте таблицу внешним (в случае, если вы определили это как не внешнюю таблицу). В этом случае вы можете удалить таблицу, не удаляя данные в каталогах.
  2. Опустить стол.
  3. Снова создайте таблицу с новой схемой (значение раздела как строка).

Этапы, описанные выше, физически (структурные папки) не будут иметь никакого отношения к структуре, которую вы уже имели. Разница будет в метафоре улья, особенно в «виртуальном столбце», создаваемом при создании разделов.

Кроме того, вместо этого вместо таких запросов, как: part_col = 1, теперь вы сможете делать запросы наподобие: part_col = '1'.

Попробуйте это и скажите, как это происходит.

+0

Отлично! Это сработало. Мне интересно, как это сделать с помощью инструкции alter table. У меня было только несколько разделов, так что это было не слишком сложно. Но я могу представить ситуацию, когда у вас большое количество столбцов.Да, вы, вероятно, можете написать программу или скрипт для этого, но не должны ли команда «просто работать»? Было бы прекрасно сделать это в одной строке. –

+0

@ChrisNjuguna подумайте об этом, вы сказали метастаре, что ваша таблица была разделена на определенный столбец, а этот столбец - int. Теперь, когда вы уже определили свою схему таблиц, вы можете добавить или удалить все разделы, которые вы хотите, но они будут типами «строк». Я думаю, что лучший способ сделать то, что вы хотите, - это сделать то, что я вам сказал, после того как вы определили новую схему таблицы, вы можете запустить таблицу команд msck repair (https://cwiki.apache.org/confluence/display/ Hive/LanguageManual + DDL # LanguageManualDDL-RecoverPartitions (MSCKREPAIRTABLE) – dbustosp

+0

Спасибо @dbustosp Я получаю ваше решение, и это было отличное быстрое исправление для моей ситуации. Однако согласно статье в URL-адресе, который я опубликовал, можно изменить типы данных разделов с помощью одна команда. Я думаю, вы согласитесь, что это потенциально лучший способ сделать это. Помните, что столбец разделов не зависит от данных, поэтому я должен быть в состоянии сделать это, не отбрасывая и не воссоздавая таблицу и разделы. Я написал в исходном вопросе. Почему команда «alter table partition» не работает? Я делаю это неправильно? –