簡體   English   中英

如何刪除和更新 Hive 中的記錄

[英]How to delete and update a record in Hive

我已經安裝了 Hadoop、Hive、Hive Z82269B9B71AB4A7732F6958610214C4。 這對我來說運行良好。 但我仍然有一個問題。 如何使用 Hive 刪除或更新單個記錄,因為 MySQL 的刪除或更新命令在 Hive 中不起作用。

謝謝

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

從 Hive 版本0.14.0 開始:INSERT...VALUES、UPDATE 和 DELETE 現在可以完全支持 ACID。

INSERT ... VALUES 語法:

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

其中 values_row 是: ( value [, value ...] ) 其中一個值為 null 或任何有效的 SQL 文字

更新語法:

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

刪除語法:

DELETE FROM tablename [WHERE expression]

此外,來自 Hive 交易文檔:

如果要在 ACID 寫入(插入、更新、刪除)中使用表,則必須在該表上設置表屬性“事務性”,從 Hive 0.14.0 開始。 如果沒有這個值,插入將以舊樣式完成; 禁止更新和刪除。

Hive DML 參考:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML
Hive 交易參考:
https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions

您不應將 Hive 視為常規 RDBMS,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,您可以重新設計您的表,使其按 id 進行分區,然后您將能夠輕松刪除要刪除的 ID 的分區。

是的,說得對。 Hive 不支持 UPDATE 選項。 但是可以使用以下替代方法來實現結果:

更新partitioned Hive table記錄:

  1. 假設主表由某個鍵分區。
  2. 將增量數據(要更新的數據)加載到與主表具有相同鍵分區的臨時表中。
  3. 使用LEFT OUTER JOIN操作連接兩個表(主表和臨時表),如下所示:

    insert overwrite table main_table partition (c,d) select t2.a, t2.b, t2.c,t2.d from staging_table t2 left outer join main_table t1 on t1.a=t2.a;

在上面的示例中, main_tablestaging_table使用(c,d)鍵進行分區。 這些表通過LEFT OUTER JOIN ,結果用於OVERWRITE main_table的分區。

un-partitioned Hive table UPDATE操作的情況下也可以使用類似的方法。

您可以使用一種變通方法從表中刪除行,在該變通方法中,您可以使用作為操作結果而留在表中的數據集覆蓋表。

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

該解決方法主要用於批量刪除易於識別的行。 此外,顯然這樣做會破壞您的數據,因此建議備份表並在計划“刪除”規則時注意。

安裝和配置 Hive 后,創建簡單表:

hive>create table testTable(id int,name string)row format delimited fields terminated by ',';

然后,嘗試在測試表中插入幾行。

hive>insert into table testTable values (1,'row1'),(2,'row2');

現在嘗試刪除記錄,您剛剛插入表中。

hive>delete from testTable where id = 1;

錯誤! 失敗:SemanticException [錯誤 10294]:嘗試使用不支持這些操作的事務管理器進行更新或刪除。

默認情況下,事務配置為關閉。 據說轉換管理器中使用的刪除操作不支持更新。 要支持更新/刪除,您必須更改以下配置。

cd  $HIVE_HOME
vi conf/hive-site.xml

將以下屬性添加到文件

<property>
  <name>hive.support.concurrency</name>
  <value>true</value>
 </property>
 <property>
  <name>hive.enforce.bucketing</name>
  <value>true</value>
 </property>
 <property>
  <name>hive.exec.dynamic.partition.mode</name>
  <value>nonstrict</value>
 </property>
 <property>
  <name>hive.txn.manager</name>
  <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
 </property>
 <property>
  <name>hive.compactor.initiator.on</name>
  <value>true</value>
 </property>
 <property>
  <name>hive.compactor.worker.threads</name>
  <value>2</value>
 </property>

重新啟動服務,然后再次嘗試刪除命令:

錯誤!

失敗:LockException [錯誤 10280]:與 Metastore 通信時出錯。

Metastore 有問題。 為了使用插入/更新/刪除操作,您需要更改 conf/hive-site.xml 中的以下配置,因為該功能目前正在開發中。

<property>
  <name>hive.in.test</name>
  <value>true</value>
 </property>

重新啟動服務,然后再次刪除命令:

hive>delete from testTable where id = 1;

錯誤!

失敗:SemanticException [錯誤 10297]:嘗試對不使用 AcidOutputFormat 或未分桶的表 default.testTable 進行更新或刪除。

第一個版本僅支持 ORC 文件格式。 該功能已構建為任何存儲格式都可以使用事務,這些格式可以確定更新或刪除如何應用於基本記錄(基本上,具有顯式或隱式行 ID),但到目前為止,集成工作僅針對獸人。

必須對表進行分桶才能使用這些功能。 同一系統中不使用事務和 ACID 的表不需要分桶。

請參閱下面帶有 ORCFileformat、啟用存儲桶和 ('transactional'='true') 的構建表示例。

hive>create table testTableNew(id int ,name string ) clustered by (id) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');

插入:

hive>insert into table testTableNew values (1,'row1'),(2,'row2'),(3,'row3');

更新 :

hive>update testTableNew set name = 'updateRow2' where id = 2;

刪除:

hive>delete from testTableNew where id = 1;

測試:

hive>select * from testTableNew ;

為 INSERT、UPDATE、DELETE 設置的配置值 除了上面列出的新參數之外,還需要設置一些現有參數以支持 INSERT ... VALUES、UPDATE 和 DELETE。

配置鍵必須設置為

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 元存儲運行的用戶),那么 Hive 將需要以擁有數據的用戶身份運行才能執行壓縮。 如果您已經設置 HiveServer2 來模擬用戶,那么唯一要做的額外工作就是確保 Hive 有權從運行 Hive 元存儲的主機模擬用戶。 這是通過將主機名添加到 Hadoop 的 core-site.xml 文件中的 hadoop.proxyuser.hive.hosts 來完成的。 如果您還沒有這樣做,那么您需要將 Hive 配置為充當代理用戶。 這需要您為運行 Hive 元存儲的用戶設置密鑰表,並將 hadoop.proxyuser.hive.hosts 和 hadoop.proxyuser.hive.groups 添加到 Hadoop 的 core-site.xml 文件。 請參閱有關您的 Hadoop 版本的安全模式的 Hadoop 文檔(例如,對於 Hadoop 2.5.1,它位於 Hadoop 的安全模式)。

UPDATE 語句具有以下限制:

WHERE 子句中的表達式必須是 Hive SELECT 子句支持的表達式。

無法更新分區和存儲桶列。

UPDATE 語句自動禁用查詢向量化。 但是,仍然可以使用矢量化來查詢更新的表。

SET 語句的右側不允許有子查詢。

以下示例演示了此語句的正確用法:

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

DELETE 語句

使用 DELETE 語句刪除已寫入 Apache Hive 的數據。

DELETE FROM tablename [WHERE expression];

DELETE 語句有以下限制:DELETE 操作會自動禁用查詢向量化。 但是,仍然可以使用矢量化查詢已刪除數據的表。

以下示例演示了此語句的正確用法:

DELETE FROM students WHERE gpa <= 1,0;

CLI 告訴你你的錯誤在哪里: delete WHAT? from student delete WHAT? from student ...

刪除: 如何從 Hadoop-Hive 中刪除/截斷表?

更新: 更新,Hive 中的 SET 選項

如果要刪除所有記錄,作為一種解決方法,請以 OVERWRITE 模式將空文件加載到表中

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

即將推出的 Hive 版本將允許基於 SET 的更新/刪除處理,這在嘗試對“一堆”行進行 CRUD 操作而不是一次處理一行時至關重要。

在此期間,我嘗試了在http://linkd.in/1Fq3wdb 中記錄的基於動態分區的方法。

請看看它是否適合您的需要。

Hive 中不允許UPDATEDELETE記錄,但可以接受INSERT INTO
Hadoop的片段:權威指南(第 3 版)

更新、事務和索引是傳統數據庫的支柱。 然而,直到最近,這些功能還沒有被視為 Hive 功能集的一部分。 這是因為 Hive 是為使用 MapReduce 操作 HDFS 數據而構建的,其中全表掃描是常態,表更新是通過將數據轉換為新表來實現的。 對於在大部分數據集上運行的數據倉庫應用程序,這很有效。

Hive 不支持更新(或刪除),但它支持 INSERT INTO,因此可以向現有表添加新行。

為了滿足您當前的需求,您需要觸發以下查詢

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

這將刪除當前表並創建具有相同名稱的新表,除要排除/刪除的行之外的所有行

我在 Hive 1.2.1 上試過這個

要設置 Hive 表支持 ACID 屬性並像 SQL 中一樣支持 UPDATE、INSERT 和 DELETE,需要設置的屬性很少

在 Hive 中創建 ACID 表的條件。 1. 該表應存儲為 ORC 文件。目前只有 ORC 格式可以支持 ACID 屬性 2. 該表必須分桶

要設置創建 ACID 表的屬性:

set hive.support.concurrency =true;
set hive.enforce.bucketing =true;
set hive.exec.dynamic.partition.mode =nonstrict
set hive.compactor.initiator.on = true;
set hive.compactor.worker.threads= 1;
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;

在 hive.site.xml 中將屬性 hive.in.test 設置為 true

設置所有這些屬性后,應使用 tblproperty 'transactional'='true' 創建表。 該表應該被分桶並保存為 orc

CREATE TABLE table_name (col1 int,col2 string, col3 int) CLUSTERED BY col1 INTO 4 
BUCKETS STORED AS orc tblproperties('transactional' ='true');

現在 Hive 表可以支持 UPDATE 和 DELETE 查詢

最近在 Hive 版本 0.14 中添加了刪除刪除只能在支持 ACID 的表上執行以下是來自 Apache 的鏈接。

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

好消息,現在可以使用 Kudu 在 Hive/Impala 上插入更新和刪除。

您需要使用 IMPALA/kudu 來維護表並執行插入/更新/刪除記錄。 可以在此處找到示例的詳細信息: insert-update-delete-on-hadoop

如果您感到興奮,請分享這個消息。

-MIK

最近我想解決一個類似的問題,Apache Hive,Hadoop 不支持更新/刪除操作。 所以 ? 所以你有兩種方法:

  1. 使用備份表:將整個表保存在一個備份表中,然后截斷你的輸入表,然后只重寫你想要維護的數據。
  2. 使用Uber Hudi :這是 Uber 創建的一個框架,用於解決 HDFS 限制,包括刪除和更新。 您可以在此鏈接中查看: https : //eng.uber.com/hoodie/

第 1 點的示例:

Create table bck_table like input_table;
Insert overwrite table bck_table 
    select * from input_table;
Truncate table input_table;
Insert overwrite table input_table
    select * from bck_table where id <> 1;

注意:如果 input_table 是外部表,您必須遵循以下鏈接: How to truncate a partitioned external table in hive?

如果要使用 ACID 操作執行 Hive CRUD,則需要檢查是否有 hive 0.14 版本

為了執行 CREATE、SELECT、UPDATE、DELETE,我們必須確保在創建表時滿足以下條件

  • 文件格式應為 ORC 文件格式
    TBLPROPERTIES('事務性'='true')
  • 表應該是 CLUSTERED BY
    對於一些 Buckets,請參考下面的 CREATE TABLE 語句。 您可以使用以下查詢來創建具有上述屬性的表 -
CREATE TABLE STUDENT
(
STD_ID INT,
STD_NAME STRING,
AGE INT,
ADDRESS STRING
)
CLUSTERED BY (ADDRESS) into 3 buckets
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED as orc tblproperties('transactional'='true');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM