如何删除和更新Hive中的记录

时间:2013-07-23 12:44:32

标签: hadoop hive sql-delete

我安装了Hadoop,Hive,Hive JD BC。这对我来说运行良好。但我还是有问题。如何使用Hive删除或更新单个记录,因为MySQL的删除或更新命令在配置单元中不起作用。

谢谢

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

15 个答案:

答案 0 :(得分:86)

从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是: (值[,值...]) 其中值为null或任何有效的SQL文字

更新语法:

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

DELETE语法:

DELETE FROM tablename [WHERE expression]

此外,来自Hive Transactions doc:

  

如果要在ACID写入(插入,更新,删除)中使用表,那么表属性&#34; transactional&#34;必须在该表上设置,从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

答案 1 :(得分:62)

您不应该将Hive视为常规RDBMS,Hive更适合对非常大的不可变数据集进行批处理。

以下内容适用于Hive 0.14之前的版本,请参阅@ashtonium对更高版本的回答。

没有支持删除或更新特定记录或特定记录集的操作,对我而言,这更像是一个糟糕架构的标志。

以下是in the official documentation

的内容
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的分区。

答案 2 :(得分:18)

是的,正确地说。 Hive不支持UPDATE选项。 但是可以使用以下替代方法来实现结果:

更新partitioned Hive table中的记录:

  1. 假设主表由某个键分区。
  2. 将增量数据(要更新的数据)加载到使用与主表相同的键分区的临时表中。
  3. 使用LEFT OUTER JOIN操作加入两个表(主表和登台表),如下所示:
  4.   

    插入覆盖表main_table分区(c,d)        选择t2.a,t2.b,t2.c,t2.d从staging_table t2左外连接main_table t1 on t1.a = t2.a;

    在上面的例子中,main_table&amp; staging_table使用(c,d)键分区。这些表通过LEFT OUTER JOIN连接,结果用于OVERWRITE main_table中的分区。

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

答案 3 :(得分:6)

您可以使用变通方法从表中删除行,在该变通方法中,您可以根据操作将要保留的数据集覆盖到表中。

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

该解决方法主要用于批量删除易于识别的行。此外,显然这样做可能会破坏您的数据,因此建议在计划“删除”规则时对表进行备份并小心。

答案 4 :(得分:3)

CLI告诉你你的错误在哪里:delete WHAT? from student ......

删除:How to delete/truncate tables from Hadoop-Hive?

更新:Update , SET option in Hive

答案 5 :(得分:3)

如果要删除所有记录,则将其作为解决方法在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

答案 6 :(得分:3)

要为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 Metastore运行的用户),则Hive将需要以拥有数据的用户身份运行才能执行压缩。如果您已经设置了HiveServer2来模拟用户,那么唯一需要做的工作就是确保Hive有权从运行Hive Metastore的主机模拟用户。这是通过在Hadoop的core-site.xml文件中将主机名添加到hadoop.proxyuser.hive.hosts来完成的。如果您尚未执行此操作,则需要将Hive配置为充当代理用户。这要求您为运行Hive Metastore的用户设置keytabs,并将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语句删除已写入Apache Hive的数据。

DELETE FROM tablename [WHERE expression];

DELETE语句具有以下限制: DELETE操作会自动禁用查询向量化。 但是,仍然可以使用矢量化查询包含已删除数据的表。

以下示例演示了此语句的正确用法:

DELETE FROM students WHERE gpa <= 1,0;

答案 7 :(得分:2)

即将推出的Hive版本将允许基于SET的更新/删除处理,这在尝试对“一堆”行进行CRUD操作时非常重要,而不是一次占用一行。

在此期间,我尝试了一种基于动态分区的方法http://linkd.in/1Fq3wdb

请查看它是否符合您的需要。

答案 8 :(得分:2)

安装并配置了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]:与元存储库通信时发生错误。

元存储存在问题。为了使用插入/更新/删除操作,您需要在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),但是到目前为止,集成工作仅针对ORC。

必须对表进行存储才能使用这些功能。同一系统中未使用事务和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 ;

答案 9 :(得分:1)

UPDATEDELETE在Hive中不允许记录,但INSERT INTO是可以接受的。
来自 Hadoop:The Definitive Guide(第3版)的片段

  

更新,事务和索引是传统数据库的支柱。然而,直到最近,这些功能还没有被认为是Hive功能集的一部分。这是因为构建Hive是为了使用MapReduce对HDFS数据进行操作,其中全表扫描是常态,并且通过将数据转换为新表来实现表更新。对于在数据集的大部分上运行的数据仓库应用程序,这很有效。

     

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

答案 10 :(得分:0)

最近在Hive版本0.14中添加了删除 删除只能在支持ACID的表上执行 以下是Apache的链接。

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

答案 11 :(得分:0)

要满足您当前的需求,您需要触发查询

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

这将删除当前表并创建具有相同名称的新表,除了要排除/删除的行之外的所有行

我在Hive 1.2.1

上尝试了这个

答案 12 :(得分:0)

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

您需要使用IMPALA / kudu来维护表并执行插入/更新/删除记录。 有关示例的详细信息,请访问: insert-update-delete-on-hadoop

如果您感到兴奋,请分享新闻。

-MIK

答案 13 :(得分:0)

最近我一直在寻找解决类似的问题,Apache Hive,Hadoop不支持更新/删除操作。那呢 因此,您有两种方法:

  1. 使用备份表:将整个表保存在b​​ackup_table中,然后截断输入表,然后仅重新编写要维护的数据。
  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;

NB :如果input_table是外部表,则必须单击以下链接: How to truncate a partitioned external table in hive?

答案 14 :(得分:0)

很少有属性可以使Hive表支持ACID属性并支持UPDATE,INSERT和DELETE,如SQL中一样

在Hive中创建ACID表的条件。 1.该表应存储为ORC文件。目前只有ORC格式可以支持ACID prpoperties 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查询