Cha*_*ngh 59 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
Run Code Online (Sandbox Code Playgroud)
ash*_*ium 90
从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 ...]
Run Code Online (Sandbox Code Playgroud)
其中values_row是:(value [,value ...])其中值为null或任何有效的SQL文本
更新语法:
UPDATE tablename SET column = value [, column = value ...] [WHERE expression]
Run Code Online (Sandbox Code Playgroud)
DELETE语法:
DELETE FROM tablename [WHERE expression]
Run Code Online (Sandbox Code Playgroud)
此外,从Hive Transactions doc:
如果要在ACID写入(插入,更新,删除)中使用表,则必须在该表上设置表属性"transactional",从Hive 0.14.0开始.没有这个值,插入将以旧样式完成; 将禁止更新和删除.
Hive DML参考:
https
:
//cwiki.apache.org/confluence/display/Hive/LanguageManual+DML
Hive Transactions参考:https:
//cwiki.apache.org/confluence/display/Hive/Hive+Transactions
Cha*_*guy 68
您不应该将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).
Run Code Online (Sandbox Code Playgroud)
解决这个限制的一种方法是使用分区:我不知道你的id对应,但是如果你分别得到不同批次的id,你可以重新设计你的表,使它按id分区,然后你可以轻松地删除你想要摆脱的ID的分区.
Sud*_*mar 18
是的,正确地说.Hive不支持UPDATE选项.但是可以使用以下替代方案来实现结果:
更新记录partitioned Hive table:
insert overwrite table main_table partition(c,d)选择t2.a,t2.b,t2.c,t2.d从staging_table t2左外连接main_table t1 on t1.a = t2.a;
在上面的示例中,main_table和staging_table使用(c,d)键进行分区.这些表通过LEFT OUTER JOIN连接,结果用于OVERWRITE main_table中的分区.
在un-partitioned Hive tableUPDATE操作的情况下也可以使用类似的方法.
小智 7
您可以使用变通方法从表中删除行,在该变通方法中,您可以根据操作将要保留的数据集覆盖到表中.
insert overwrite table your_table
select * from your_table
where id <> 1
;
Run Code Online (Sandbox Code Playgroud)
该解决方法主要用于批量删除易于识别的行.此外,显然这样做可能会破坏您的数据,因此建议在计划"删除"规则时建议表的备份并注意.
安装和配置 Hive 后,创建简单表:
hive>create table testTable(id int,name string)row format delimited fields terminated by ',';
Run Code Online (Sandbox Code Playgroud)
然后,尝试在测试表中插入几行。
hive>insert into table testTable values (1,'row1'),(2,'row2');
Run Code Online (Sandbox Code Playgroud)
现在尝试删除记录,您刚刚插入表中。
hive>delete from testTable where id = 1;
Run Code Online (Sandbox Code Playgroud)
错误!失败:SemanticException [错误 10294]:尝试使用不支持这些操作的事务管理器进行更新或删除。
默认情况下,事务配置为关闭。据说转换管理器中使用的删除操作不支持更新。要支持更新/删除,您必须更改以下配置。
cd $HIVE_HOME
vi conf/hive-site.xml
Run Code Online (Sandbox Code Playgroud)
将以下属性添加到文件
<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>
Run Code Online (Sandbox Code Playgroud)
重新启动服务,然后再次尝试删除命令:
错误!
失败:LockException [错误 10280]:与 Metastore 通信时出错。
Metastore 有问题。为了使用插入/更新/删除操作,您需要更改 conf/hive-site.xml 中的以下配置,因为该功能目前正在开发中。
<property>
<name>hive.in.test</name>
<value>true</value>
</property>
Run Code Online (Sandbox Code Playgroud)
重新启动服务,然后再次删除命令:
hive>delete from testTable where id = 1;
Run Code Online (Sandbox Code Playgroud)
错误!
失败: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');
Run Code Online (Sandbox Code Playgroud)
插入 :
hive>insert into table testTableNew values (1,'row1'),(2,'row2'),(3,'row3');
Run Code Online (Sandbox Code Playgroud)
更新 :
hive>update testTableNew set name = 'updateRow2' where id = 2;
Run Code Online (Sandbox Code Playgroud)
删除 :
hive>delete from testTableNew where id = 1;
Run Code Online (Sandbox Code Playgroud)
测试 :
hive>select * from testTableNew ;
Run Code Online (Sandbox Code Playgroud)
要为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元存储的主机中模拟用户。这是通过将主机名添加到Hadoop的core-site.xml文件中的hadoop.proxyuser.hive.hosts中来完成的。如果尚未执行此操作,则需要将Hive配置为充当代理用户。这要求您为运行Hive Metastore的用户设置密钥标签,并将hadoop.proxyuser.hive.hosts和hadoop.proxyuser.hive.groups添加到Hadoop的core-site.xml文件中。
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;
| 归档时间: |
|
| 查看次数: |
251234 次 |
| 最近记录: |