我已经安装了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
我已经安装了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
15条答案
按热度按时间x7yiwoj41#
好消息,现在可以使用kudu在hive/impala上插入更新和删除。
您需要使用impala/kudu来维护表并执行insert/update/delete记录。示例的详细信息可以在这里找到:insert update delete on hadoop
如果你很兴奋,请分享这个消息。
-米克
js4nwp542#
即将发布的hive版本将允许基于集的更新/删除处理,这在尝试对“一堆”行执行crud操作时非常重要,而不是一次只执行一行。
在此期间,我尝试了一种基于动态分区的方法http://linkd.in/1fq3wdb .
请看看是否适合你的需要。
0h4hbjxa3#
如果您想删除所有记录,那么作为一种解决方法,可以在覆盖模式下将一个空文件加载到表中
56lgkhnf4#
您可以使用一种变通方法从表中删除行,在这种方法中,您可以使用希望作为操作结果留在表中的数据集覆盖表。
解决方法主要用于批量删除易于识别的行。而且,这样做显然会弄脏数据,因此建议备份表,并在规划“删除”规则时予以注意。
k2arahey5#
您不应该将hive看作常规的rdbms,hive更适合于对非常大的不可变数据集进行批处理。
以下内容适用于Hive0.14之前的版本,请参阅ashtonium的答案以获取更高版本。
不支持删除或更新特定记录或特定记录集的操作,对我来说,这更像是一个糟糕模式的标志。
以下是您可以在官方文档中找到的内容:
解决这个限制的一种方法是使用分区:我不知道您的id对应什么,但是如果您分别获得不同批次的id,您可以重新设计您的表,使其按id进行分区,然后您就可以轻松地删除要除去的id的分区。
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
操作也一样。lyfkaqu17#
安装并配置配置单元后,请创建简单表:
然后,尝试在测试表中插入几行。
现在尝试删除记录,您刚刚插入到表中。
错误!失败:semanticexception[error 10294]:尝试使用不支持这些操作的事务管理器进行更新或删除。
默认情况下,事务被配置为关闭。据说转换管理器中使用的删除操作不支持更新。要支持更新/删除,必须更改以下配置。
将以下属性添加到文件
重新启动服务,然后再次尝试删除命令:
错误!
失败:lockexception[错误10280]:与元存储通信时出错。
metastore有问题。为了使用insert/update/delete操作,您需要更改conf/hive-site.xml中的以下配置,因为该特性目前正在开发中。
重新启动服务,然后再次删除命令:
错误!
失败:semanticexception[error 10297]:尝试对不使用acidoutputformat或未绑定的表default.testtable执行更新或删除操作。
此第一个版本仅支持orc文件格式。该特性的构建使得事务可以由任何存储格式使用,这些存储格式可以确定如何将更新或删除应用于基本记录(基本上,具有显式或隐式行id),但到目前为止,集成工作仅针对orc完成。
为了利用这些特点,table必须装上扣子。在同一个系统中,不使用事务和acid的表不需要被绑定。
请参阅下面使用orcfileformat、bucket enabled和('transactional'='true')构建的表示例。
插入:
更新:
删除:
测试:
42fyovps8#
要使配置单元表支持acid属性并像sql那样支持update、insert和delete,需要设置的属性很少
在配置单元中创建acid表的条件。1表应存储为orc文件。只有orc格式才能支持ac
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;
yiytaume10#
cli告诉您错误在哪里:
delete WHAT? from student
...delete:如何从hadoop配置单元中删除/截断表?
更新:更新,在配置单元中设置选项
kq0g1dla11#
最近我想解决一个类似的问题,apachehive,hadoop不支持更新/删除操作。所以呢?所以你有两种方法:
使用备份表:将整个表保存在备份表中,然后截断输入表,然后只重新写入您感兴趣的数据。
使用uberhudi:它是uber创建的一个框架,用于解决hdfs的限制,包括删除和更新。您可以在以下链接中查看:https://eng.uber.com/hoodie/
点1的示例:
注意:如果输入表是外部表,则必须遵循以下链接:如何在配置单元中截断已分区的外部表?
nimxete212#
为了满足您当前的需要,您需要在下面进行查询
这将删除当前表,并使用除要排除/删除的行以外的所有行创建具有相同名称的新表
我在Hive1.2.1上试过这个
gt0wga4j13#
最近在hiveversion0.14中添加了delete,删除只能在支持acid的表上执行,下面是来自apache的链接。
https://cwiki.apache.org/confluence/display/hive/languagemanual+dml#languagemanualdml-删除
kqhtkvqz14#
从配置单元版本0.14.0开始:插入…值、更新和删除现在可以完全支持acid。
插入。。。值语法:
where values_row is:(value[,value…]),其中值为null或任何有效的sql文本
更新语法:
删除语法:
此外,从配置单元事务文档:
如果要在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
9wbgstp715#
UPDATE
或者DELETE
Hive中不允许有记录,但是INSERT INTO
可以接受。hadoop的片段:权威指南(第3版):
更新、事务和索引是传统数据库的支柱。然而,直到最近,这些特性还没有被认为是hive特性集的一部分。这是因为构建hive是为了使用mapreduce对hdfs数据进行操作,在mapreduce中,全表扫描是标准的,表更新是通过将数据转换为新表来实现的。对于在数据集的很大一部分上运行的数据仓库应用程序来说,这种方法非常有效。
配置单元不支持更新(或删除),但它支持插入,因此可以向现有表中添加新行。