Подтвердить что ты не робот

Столбец добавления или удаления таблицы добавления таблицы

У меня есть таблица orc в hive Я хочу удалить столбец из этой таблицы

ALTER TABLE table_name drop  col_name;

но я получаю следующее исключение

Произошла ошибка при выполнении запроса куста: OK FAILED: строка ParseException 1:35 msgstr "Невозможно выполнить запрос" user_id1 ", ожидая, что PARTITION около 'drop' в инструкции о сокращении

Может ли кто-нибудь помочь мне или дать какую-либо идею сделать это? Заметьте, я using hive 0.14

4b9b3361

Ответ 1

Вы не можете удалить столбец из таблицы с помощью команды ALTER TABLE table_name drop col_name;

Единственный способ удаления столбца - использовать команду replace. Допустим, у меня есть таблица emp с идентификатором, именем и столбцом департамента. Я хочу удалить столбец столбца таблицы emp. Поэтому укажите все те столбцы, которые вы хотите быть частью таблицы, взамен столбцов. Команда ниже приведет к удалению столбца id из таблицы emp.

 ALTER TABLE emp REPLACE COLUMNS( name string, dept string);

Ответ 2

предположим, что у вас есть внешняя таблица, а именно. организация .employee как: (не включая TBLPROPERTIES)

hive> show create table organization.employee;
OK
CREATE EXTERNAL TABLE `organization.employee`(
      `employee_id` bigint,
      `employee_name` string,
      `updated_by` string,
      `updated_date` timestamp)
    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'
    LOCATION
      'hdfs://getnamenode/apps/hive/warehouse/organization.db/employee'

Вы хотите удалить столбцы updated_by, updated_date из таблицы. Выполните следующие действия:

создайте реплику таблицы temp для организации .employee как:

hive> create table organization.employee_temp as select * from organization.employee;

отбросьте основную таблицу organization.employee.

hive> drop table organization.employee;

удалить базовые данные из HDFS (необходимо выйти из оболочки улья)

[[email protected] myfile]$ hadoop fs -rm hdfs://getnamenode/apps/hive/warehouse/organization.db/employee/*

создайте таблицу с удаленными столбцами по мере необходимости:

hive> CREATE EXTERNAL TABLE `organization.employee`(
  `employee_id` bigint,
  `employee_name` 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'
LOCATION
  'hdfs://getnamenode/apps/hive/warehouse/organization.db/employee'

вставить исходные записи в исходную таблицу.

hive> insert into organization.employee 
select employee_id, employee_name from organization.employee_temp;

наконец, отбросить созданную таблицу temp

hive> drop table organization.employee_temp;

Ответ 3

ALTER TABLE emp REPLACE COLUMNS( name string, dept string);

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

Insert <New Table> Select <selective columns> from <Old Table> 

Ответ 5

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

Вот что я бы сделал:

-- make a copy of the old table
ALTER TABLE table RENAME TO table_to_dump;

-- make the new table without the columns to be deleted
CREATE TABLE table AS
SELECT '(col_to_remove_1|col_to_remove_2)?+.+'
FROM table_to_dump;

-- dump the table 
DROP TABLE table_to_dump;

Если рассматриваемая таблица не слишком большая, это должно работать просто хорошо.

Ответ 6

Спасибо за ответ Изменить таблицу tbl_name drop col_name; я пробовал вышеупомянутую команду, но она дает следующее исключение MismatchedTokenException (253! = 196)

Ответ 7

Даже ниже запрос работает для меня.

Alter table tbl_name drop col_name