Hive не поддерживает ACID-транзакции обычным способом. Вам понадобятся некоторые предварительные условия и непонятные ограничения транзакций ACID в Hive.
Вы можете просмотреть эту статью:
https://www.cloudera.com/tutorials/using-hive-acid-transactions-to-insert-update-and-delete-data/.html#operational -tools-for-acid
для получения дополнительной информации о транзакциях Hive.
Предварительные условия Диспетчер транзакций Hive должен иметь значение DbTxnManager SET hive.txn.manager = org. apache .had oop .hive.ql .lockmgr.DbTxnManager;
Нам нужно включить параллелизм SET hive.support.concurrency = true;
Как только мы установим вышеуказанные свойства, мы сможем вставить данные в любую таблицу. Для обновлений и удалений таблица должна быть объединена, а формат файла должен быть ИЛИ C или любой совместимый с ACID формат. Нам также нужно установить для транзакций свойства таблицы значение true TBLPROPERTIES ('транзакция' = 'истина');
ОБЗОР СВОЙСТВ
$ cd / etc / hive / conf
$ grep -i txn hive-site. xml
$ hive -e "SET;" | grep -i txn
$ beeline -u jdb c: hive2: // localhost: 10000 / training_retail
В качестве примера для создания таблицы транзакций в HIVE
SET hive.txn.manager;
hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DummyTxnManager;
SET hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
SET hive.support.concurrency=true;
SET hive.enforce.bucketing;
SET hive.enforce.bucketing=true;
SET hive.exec.dynamic.partition.mode;
hive.exec.dynamic.partition.mode=strict
SET hive.exec.dynamic.partition.mode=nonstrict;
SET hive.compactor.initiator.on;
SET hive.compactor.initiator.on=true;
-- A positive number
SET hive.compactor.worker.threads;
SET hive.compactor.worker.threads=1;
CREATE TABLE orders_transactional (
order_id INT,
order_date STRING,
order_customer_id INT,
order_status STRING
) CLUSTERED BY (order_id) INTO 8 BUCKETS
STORED AS ORC
TBLPROPERTIES("transactional"="true");
INSERT INTO orders_transactional VALUES
(1, '2013-07-25 00:00:00.0', 1000, 'COMPLETE');
INSERT INTO orders_transactional VALUES
(2, '2013-07-25 00:00:00.0', 2001, 'CLOSED'),
(3, '2013-07-25 00:00:00.0', 1500, 'PENDING'),
(4, '2013-07-25 00:00:00.0', 2041, 'PENDING'),
(5, '2013-07-25 00:00:00.0', 2031, 'COMPLETE');
UPDATE orders_transactional
SET order_status = 'COMPLETE'
WHERE order_status = 'PENDING';
DELETE FROM orders_transactional
WHERE order_status <> 'COMPLETE';
SELECT *
FROM orders_transactional;
Надеюсь, это может быть полезно,
С уважением.