如何删除和更新Hive中的logging

我已经安装了Hadoop,Hive,Hive JD BC。 这对我来说运行良好。 但是我仍然有一个问题。 如何使用Hive删除或更新单个logging,因为MySQL的删除或更新命令在configuration单元中不起作用。

谢谢

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

你不应该把Hive想象成一个常规的RDBMS,Hive更适合于对大量不可变数据进行批处理。

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

删除或更新特定logging或特定logging不支持任何操作,而对我来说,这更像是一个糟糕的模式。

以下是您可以在官方文档中find的内容 :

 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,你可以重新devise你的表,使它被id分区,然后您将能够轻松地删除您想要摆脱的ID的分区。

从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语法:

 DELETE FROM tablename [WHERE expression] 

另外,从Hive Transactions文档:

如果要在ACID写入(插入,更新,删除)中使用表格,则必须在该表格上设置表格属性“transactional”,从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不支持UPDATE选项。 但是可以使用以下替代方法来实现结果:

更新partitioned Hive tablelogging:

  1. 假设主表被一些关键字分隔。
  2. 将增量数据(要更新的数据)加载到使用与主表相同的键进行分区的登台表中。
  3. 使用如下所示的LEFT OUTER JOIN操作来连接两个表(主表和主表):

插入覆盖表main_table分区(c,d)从staging_table中selectt2.a,t2.b,t2.c,t2.d t2在t1.a = t2.a上的左外连接main_table t1;

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

对于un-partitioned Hive table UPDATE操作,也可以使用类似的方法。

您可以使用一种解决方法从表中删除行,在该解决方法中,作为操作的结果,您要将希望保留在表中的数据集覆盖到表上。

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

解决方法主要用于容易识别的行的批量删除。 另外,显然这样做可能会弄糟你的数据,所以在规划“删除”规则时,build议备份表并给予警告。

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

删除: 如何从Hadoop-Hive中删除/截断表?

更新: 更新,Hive中的SET选项

即将发布的Hive版本将允许基于SET的更新/删除处理,这对于在一堆“行”上执行CRUD操作而不是一次只读一行是非常重要的。

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

请看看它是否适合你的需要。

如果您想删除所有logging,则在解决scheme中将空文件加载到表格中

 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中不允许UPDATEDELETE一条logging,但INSERT INTO是可以接受的。
Hadoop的一个片段:权威指南(第三版)

更新,事务和索引是传统数据库的支柱。 然而,直到最近,这些特性才被认为是Hive特性的一部分。 这是因为Hive是使用MapReduce来操作HDFS数据的,其中全表扫描是常态,通过将数据转换为新表来实现表更新。 对于运行在大部分数据集上的数据仓库应用程序,这种方式效果很好。

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

为INSERT,UPDATE和DELETE设置的configuration值除了上面列出的新参数之外,还需要设置一些现有参数以支持INSERT … VALUES,UPDATE和DELETE。

configuration键必须设置为

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)

configuration值设置为压缩

如果系统中的数据不属于Hive用户(即Hive Metastore运行的用户),则Hive将需要作为拥有数据的用户运行权限才能执行压缩。 如果您已经设置了HiveServer2来模拟用户,那么唯一额外的工作就是确保Hive有权从运行Hive Metastore的主机模拟用户。 这是通过将主机名添加到Hadoop的core-site.xml文件中的hadoop.proxyuser.hive.hosts来完成的。 如果您尚未完成此操作,则需要将Hiveconfiguration为代理用户。 这要求您为运行Hive Metastore的用户设置密钥表,并将hadoop.proxyuser.hive.hosts和hadoop.proxyuser.hive.groups添加到Hadoop的core-site.xml文件中。 有关您的Hadoop版本的安全模式,请参阅Hadoop文档(例如,对于Hadoop 2.5.1,它位于安全模式下的Hadoop)。

UPDATE语句有以下限制:

WHERE子句中的expression式必须是由Hive SELECT子句支持的expression式。

分区和存储桶列不能更新。

查询vector化会自动禁用UPDATE语句。 但是,更新后的表格仍然可以使用vector化查询。

子查询不允许在SET语句的右侧。

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

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

DELETE语句

使用DELETE语句删除已经写入Apache Hive的数据。

DELETE FROM tablename [WHERE expression];

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

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

DELETE FROM students WHERE gpa <= 1,0;

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

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

为了实现您当前的需求,您需要在查询之下触发

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

这将删除当前表并使用除了您要排除/删除的行以外的所有行创build具有相同名称的新表

我在Hive 1.2.1上试过这个

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

您需要使用IMPALA / kudu来维护表并执行插入/更新/删除logging。 详细的例子可以在这里find: insert-update-delete-on-hadoop

如果你兴奋,请分享这个消息。

-MIK