如何删除和更新配置单元中的记录

h6my8fg2  于 2021-06-03  发布在  Hadoop
关注(0)|答案(15)|浏览(463)

我已经安装了hadoop,hive,hivejdbc。对我来说很好。但我还是有个问题。如何使用配置单元删除或更新单个记录,因为mysql的delete或update命令在配置单元中不起作用。
谢谢

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

x7yiwoj41#

好消息,现在可以使用kudu在hive/impala上插入更新和删除。
您需要使用impala/kudu来维护表并执行insert/update/delete记录。示例的详细信息可以在这里找到:insert update delete on hadoop
如果你很兴奋,请分享这个消息。
-米克

js4nwp54

js4nwp542#

即将发布的hive版本将允许基于集的更新/删除处理,这在尝试对“一堆”行执行crud操作时非常重要,而不是一次只执行一行。
在此期间,我尝试了一种基于动态分区的方法http://linkd.in/1fq3wdb .
请看看是否适合你的需要。

0h4hbjxa

0h4hbjxa3#

如果您想删除所有记录,那么作为一种解决方法,可以在覆盖模式下将一个空文件加载到表中

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
56lgkhnf

56lgkhnf4#

您可以使用一种变通方法从表中删除行,在这种方法中,您可以使用希望作为操作结果留在表中的数据集覆盖表。

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

解决方法主要用于批量删除易于识别的行。而且,这样做显然会弄脏数据,因此建议备份表,并在规划“删除”规则时予以注意。

k2arahey

k2arahey5#

您不应该将hive看作常规的rdbms,hive更适合于对非常大的不可变数据集进行批处理。
以下内容适用于Hive0.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的分区。

q5lcpyga

q5lcpyga6#

是的,我说得对。配置单元不支持更新选项。但可以使用以下替代方法来实现该结果:
更新中的记录 partitioned Hive table :
假设主表由某个键进行分区。
将增量数据(要更新的数据)加载到使用与主表相同的键分区的临时表中。
使用 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_table &那个 staging_table 使用 (c,d) 钥匙。这些表通过 LEFT OUTER JOIN 结果用于 OVERWRITE 中的分区 main_table .
类似的方法也可用于
un-partitioned Hive table UPDATE 操作也一样。

lyfkaqu1

lyfkaqu17#

安装并配置配置单元后,请创建简单表:

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[error 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有问题。为了使用insert/update/delete操作,您需要更改conf/hive-site.xml中的以下配置,因为该特性目前正在开发中。

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

重新启动服务,然后再次删除命令:

hive>delete from testTable where id = 1;

错误!
失败:semanticexception[error 10297]:尝试对不使用acidoutputformat或未绑定的表default.testtable执行更新或删除操作。
此第一个版本仅支持orc文件格式。该特性的构建使得事务可以由任何存储格式使用,这些存储格式可以确定如何将更新或删除应用于基本记录(基本上,具有显式或隐式行id),但到目前为止,集成工作仅针对orc完成。
为了利用这些特点,table必须装上扣子。在同一个系统中,不使用事务和acid的表不需要被绑定。
请参阅下面使用orcfileformat、bucket enabled和('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 ;
42fyovps

42fyovps8#

要使配置单元表支持acid属性并像sql那样支持update、insert和delete,需要设置的属性很少
在配置单元中创建acid表的条件。1表应存储为orc文件。只有orc格式才能支持ac

lvjbypge

lvjbypge9#

要为insert、update、delete设置的配置值除了上面列出的新参数外,还需要设置一些现有参数以支持insert。。。值、更新和删除。
配置密钥必须设置为 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) 要为压缩设置的配置值
如果系统中的数据不属于配置单元用户(即配置单元元存储运行时的用户),则配置单元将需要以拥有数据的用户身份运行的权限才能执行压缩。如果已经将hiveserver2设置为模拟用户,那么要做的唯一额外工作就是确保hive有权从运行hive元存储的主机模拟用户。这是通过将主机名添加到hadoop的core-site.xml文件中的hadoop.proxyuser.hive.hosts来完成的。如果尚未执行此操作,则需要将配置单元配置为代理用户。这需要为运行配置单元元存储的用户设置键选项卡,并将hadoop.proxyuser.hive.hosts和hadoop.proxyuser.hive.groups添加到hadoop的core-site.xml文件中。有关hadoop版本的信息,请参阅安全模式下的hadoop文档(例如,对于hadoop2.5.1,它位于安全模式下的hadoop)。
update语句有以下限制:
where子句中的表达式必须是配置单元select子句支持的表达式。
无法更新分区列和存储桶列。
update语句将自动禁用查询矢量化。但是,仍然可以使用矢量化查询更新的表。
set语句的右侧不允许子查询。
以下示例演示此语句的正确用法: UPDATE students SET name = null WHERE gpa <= 1.0; 删除语句
使用delete语句删除已经写入apache配置单元的数据。 DELETE FROM tablename [WHERE expression]; delete语句具有以下限制:delete操作将自动禁用查询向量化。但是,仍然可以使用矢量化查询包含已删除数据的表。
以下示例演示此语句的正确用法: DELETE FROM students WHERE gpa <= 1,0;

yiytaume

yiytaume10#

cli告诉您错误在哪里: delete WHAT? from student ...
delete:如何从hadoop配置单元中删除/截断表?
更新:更新,在配置单元中设置选项

kq0g1dla

kq0g1dla11#

最近我想解决一个类似的问题,apachehive,hadoop不支持更新/删除操作。所以呢?所以你有两种方法:
使用备份表:将整个表保存在备份表中,然后截断输入表,然后只重新写入您感兴趣的数据。
使用uberhudi:它是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;

注意:如果输入表是外部表,则必须遵循以下链接:如何在配置单元中截断已分区的外部表?

nimxete2

nimxete212#

为了满足您当前的需要,您需要在下面进行查询

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

这将删除当前表,并使用除要排除/删除的行以外的所有行创建具有相同名称的新表
我在Hive1.2.1上试过这个

gt0wga4j

gt0wga4j13#

最近在hiveversion0.14中添加了delete,删除只能在支持acid的表上执行,下面是来自apache的链接。
https://cwiki.apache.org/confluence/display/hive/languagemanual+dml#languagemanualdml-删除

kqhtkvqz

kqhtkvqz14#

从配置单元版本0.14.0开始:插入…值、更新和删除现在可以完全支持acid。
插入。。。值语法:

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

where values_row is:(value[,value…]),其中值为null或任何有效的sql文本
更新语法:

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

删除语法:

DELETE FROM tablename [WHERE expression]

此外,从配置单元事务文档:
如果要在acid写入(insert、update、delete)中使用表,则必须在该表上设置表属性“transactional”,从hive0.14.0开始。没有这个值,插入将以旧样式进行;将禁止更新和删除。
配置单元dml参考:
https://cwiki.apache.org/confluence/display/hive/languagemanual+dml
配置单元事务参考:
https://cwiki.apache.org/confluence/display/hive/hive+transactions

9wbgstp7

9wbgstp715#

UPDATE 或者 DELETE Hive中不允许有记录,但是 INSERT INTO 可以接受。
hadoop的片段:权威指南(第3版):
更新、事务和索引是传统数据库的支柱。然而,直到最近,这些特性还没有被认为是hive特性集的一部分。这是因为构建hive是为了使用mapreduce对hdfs数据进行操作,在mapreduce中,全表扫描是标准的,表更新是通过将数据转换为新表来实现的。对于在数据集的很大一部分上运行的数据仓库应用程序来说,这种方法非常有效。
配置单元不支持更新(或删除),但它支持插入,因此可以向现有表中添加新行。

相关问题