Как удалить и обновить запись в Hive

Я установил Hadoop, Hive, Hive JD BC. которые для меня работают нормально. Но у меня все еще есть проблема. Как удалить или обновить одну запись с помощью Hive, потому что команда delete или update MySQL не работает в hive.

спасибо

hive> delete from student where id=1;
Usage: delete [FILE|JAR|ARCHIVE] <value> [<value>]*
Query returned non-zero code: 1, cause: null

12 ответов


вы не должны думать о Hive как о обычной СУБД, Hive лучше подходит для пакетной обработки очень больших наборов неизменяемых данных.

следующее относится к версиям до Hive 0.14, см. ответ @ashtonium для более поздних версий.

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

вот что вы можете найти в официальная документация:

Hadoop is a batch processing system and Hadoop jobs tend to have high latency and
incur substantial overheads in job submission and scheduling. As a result -
latency for Hive queries is generally very high (minutes) even when data sets
involved are very small (say a few hundred megabytes). As a result it cannot be
compared with systems such as Oracle where analyses are conducted on a
significantly smaller amount of data but the analyses proceed much more
iteratively with the response times between iterations being less than a few
minutes. Hive aims to provide acceptable (but not optimal) latency for
interactive data browsing, queries over small data sets or test queries.

Hive is not designed for online transaction processing and does not offer
real-time queries and row level updates. It is best used for batch jobs over
large sets of immutable data (like web logs).

способ обойти это ограничение-использовать разделы: я не знаю, что вы id соответствует, но если вы получаете разные пакеты идентификаторов отдельно, вы можете перепроектировать свою таблицу так, чтобы она была секционирована по id, и тогда вы сможете легко удалить разделы для идентификаторов, от которых вы хотите избавиться.


начиная с версии улья 0.14.0 вставить...Значения, обновление и удаление теперь доступны с полной поддержкой ACID.

вставить ... Синтаксис значений:

INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2] ...)] VALUES values_row [, values_row ...]

где values_row является: ( значение [, значение ...] ) где значение равно null или любому допустимому SQL-литералу

обновить синтаксис:

UPDATE tablename SET column = value [, column = value ...] [WHERE expression]

удалить синтаксис:

DELETE FROM tablename [WHERE expression]

кроме того, из документа Hive Transactions:

Если таблица должна быть используется в ACID-записи (insert, update, delete), то свойство таблицы "транзакционный" должно быть установлено в этой таблице, начиная с Hive 0.14.0. Без этого значения вставки будут выполняться в старом стиле; обновления и удаления будут запрещены.

ссылка Hive DML:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML
Операции С Ульем ссылка:
https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions


Да, правильно сказал. Hive не поддерживает опцию обновления. Но для достижения результата можно было бы использовать следующую альтернативу:

обновить записи в partitioned Hive table:

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

вставить перезаписать таблицу main_table partition (c, d) выбрать Т2.a, t2.b, t2.c, t2.d из staging_table t2 левый внешний присоединить main_table t1 на t1.a=t2.a;

в приведенном выше примере main_table и staging_table секционируются с помощью ключей (c,d). Таблицы соединяются через левое внешнее соединение, и результат используется для перезаписи разделов в main_table.

аналогичный подход может быть используется в случае un-partitioned Hive table операции обновления тоже.


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

insert overwrite table your_table 
    select * from your_table 
    where id <> 1
;

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


CLI сказал вам, где ваша ошибка:delete WHAT? from student ...

удалить : как удалить / усечь таблицы из Hadoop-Hive?

обновление : обновить, установить опцию в Hive


предстоящая версия Hive позволит установить обработку обновления/удаления, которая имеет первостепенное значение при попытке выполнить операции CRUD на "куче" строк, а не принимать одну строку за раз.

тем временем я попробовал динамический подход на основе разделов, описанный здесь http://linkd.in/1Fq3wdb .

пожалуйста, посмотрите, если это соответствует вашим потребностям.


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

hive> LOAD DATA LOCAL INPATH '/root/hadoop/textfiles/empty.txt' OVERWRITE INTO TABLE employee;
Loading data to table default.employee
Table default.employee stats: [numFiles=1, numRows=0, totalSize=0, rawDataSize=0]
OK
Time taken: 0.19 seconds

hive> SELECT * FROM employee;
OK
Time taken: 0.052 seconds

UPDATE или DELETE запись не разрешена в Hive, но INSERT INTO приемлемо.
Фрагмент из в Hadoop: полное руководство(3-е издание):

обновления, транзакций и индексы являются основой традиционных баз данных. Тем не менее, до недавнего времени эти функции не считались частью набора функций Hive. Это связано с тем, что Hive был построен для работы с данными HDFS с помощью MapReduce, где сканирование полной таблицы является нормой, а обновление таблицы достигается путем преобразования данных в новую таблицу. Для приложения хранилища данных, которое работает над большими частями набора данных, это работает хорошо.

Hive не поддерживает обновления (или удаления), но поддерживает INSERT INTO, поэтому можно добавлять новые строки в существующую таблицу.


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

конфигурационный ключ Должно быть установлено значение

hive.support.concurrency true (default is false) hive.enforce.bucketing true (default is false) (Not required as of Hive 2.0) hive.exec.dynamic.partition.mode nonstrict (default is strict)

значения конфигурации для установки для уплотнения

если данные в вашей системе не принадлежат Пользователю Hive (т. е. пользователю, который работает как метастор), затем Hive потребуется разрешение на запуск от имени пользователя, которому принадлежат данные, для выполнения сжатия. Если вы уже настроили hiveserver2 для олицетворения пользователей, то единственная дополнительная работа заключается в том, чтобы гарантировать, что Hive имеет право олицетворять пользователей с хоста, на котором запущено хранилище метастазов Hive. Это делается путем добавления имени хоста в hadoop.proxyuser.улей.хосты на основном сайте Hadoop.XML-файл. Если вы еще не сделали этого, вам нужно будет настроить Hive для работы в качестве прокси-пользователя. Этот требуется создать keytab-файлов для пользователя, выполняющего хранилищу Hive и Hadoop и добавить.proxyuser.улей.хозяева и Hadoop.proxyuser.улей.группы на основной сайт Hadoop.XML-файл. См. документацию Hadoop о безопасном режиме для вашей версии Hadoop (например, для Hadoop 2.5.1 она находится в Hadoop в безопасном режиме).

инструкция UPDATE имеет следующие ограничения:

выражение в предложении WHERE должно быть выражением, поддерживаемым кустом SELECT пункт.

столбцы разделов и ковшей не могут быть обновлены.

векторизация запросов автоматически отключается для инструкций UPDATE. Однако обновленные таблицы все еще можно запросить с помощью векторизации.

подзапросы не допускаются в правой части инструкции SET.

в следующем примере показано правильное использование этого утверждения:

UPDATE students SET name = null WHERE gpa <= 1.0;

удалить заявление

использовать инструкция DELETE для удаления данных, уже записанных в Apache Hive.

DELETE FROM tablename [WHERE expression];

оператор DELETE имеет следующее ограничение: векторизация запросов автоматически отключается для операции удаления. Однако таблицы с удаленными данными все еще можно запросить с помощью векторизации.

в следующем примере показано правильное использование этого утверждения:

DELETE FROM students WHERE gpa <= 1,0;


Delete недавно был добавлен в Hive версии 0.14 Удаление может быть выполнено только для таблиц, поддерживающих ACID Ниже приведена ссылка из Apache .

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Delete


для достижения вашей текущей потребности вам нужно запустить ниже query

> insert overwrite table student 
> select *from student 
> where id <> 1;

это удалит текущую таблицу и создаст новую таблицу с тем же именем со всеми строками, кроме строк, которые вы хотите исключить/удалить

Я пробовал это на улье 1.2.1


хорошие новости, вставить обновления и удаления теперь можно на Hive / Impala с помощью Kudu.

вам нужно использовать IMPALA / kudu для обслуживания таблиц и выполнения вставки/обновления/удаления записей. Подробности с примерами можно найти здесь: вставить-обновить-удалить-на-hadoop

пожалуйста, поделитесь новостями, если вы взволнованы.

-МИК