大数据实践HIVE详解

大数据

一.hive的事务

HIVE

(1)什么是事务

要知道hive的事务,首先要知道什么是transaction(事务)?事务就是一组单元化操作,这些操作要么都执行,要么都不执行,是一个不可分割的工作单位。

事务有四大特性:A、C、I、D (原子性、一致性、隔离性、持久性)

Atomicity: 不可再分割的工作单位,事务中的所有操作要么都发,要么都不发。

Consistency: 事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的 一致性。

Isolation: 多个事务并发访问,事务之间是隔离的

Durability: 意味着在事务完成以后,该事务锁对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

(2)hive事务的特点与局限性

从hive的0.14版本开始支持低等级的事务

支持事务的增删改查,从hive的2.2版本开始,开始支持merge

不支持事务的begin、commit以及rollback(事务的回滚)

不支持使用update更新分桶列和分区列

想使用事务的话,文件格式必须是ORC

需要压缩工作,需要时间,资源和空间

支持S(共享锁)和X(排它锁)

不允许从一个非ACID连接写入/读取ACID表

(3)hive的事务开启

hive的事务开启有三种方式:

a.通过Ambari UI-Hive Config

b.通过hive-xml 的配置文件添加如下内容

hive.support.concurrency

true

hive.txn.manager

org.apache.hadoop.hive.ql.lockmgr.DbTxnManager

c.通过命令行,在beeline这种交互式环境下:

set hive.support.concurrency = true;

set hive.enforce.bucketing = true;

set hive.exec.dynamic.partition.mode = nonstrict;

set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;

set hive.compactor.initiator.on = true;

set hive.compactor.worker.threads = 1;

(4)hive的merge

merge的语法:

MERGE INTO AS T USING AS S ON

WHEN MATCHED [AND ] THEN UPDATE SET

WHEN MATCHED [AND ] THEN DELETE

WHEN NOT MATCHED [AND ] THEN INSERT VALUES

merge的局限性:

最多三条when语句,只支持update/delete/insert。when not matched 必须在when语句的最后面。

如果出现update和delete的时候 ,两个条件是分开的,而且必须在条件前面加上AND.像 [AND ]

(5)例子

a.创建两个事务表

+ View Code

b.开启事务(见上面的开启事务的c,一般有些默认的设置是开的,我这里就只开了自动分区和分桶)

c.插入数据

+ View Code

d.检验数据是否被插入

e.这里通过merge操作,完成更新、删除、插入操作。

employe字段解释:id为2的员工之前的工作地在Toronto,现在在Beijing,state的状态为update。所以需要更新表employee中员工2的信息

id为4的员工的state状态为quit,说明目前员工已经离职,所以需要在employee表中删除关于id为4的员工的信息。

id为8的员工的state状态为new,说明是新员工,所以需要插入empoyee中。

+ View Code

二.hive的udf

(1)什么是hive的udf

User-defined function (UDF): 这提供了一种使用外部函数(在Java中)扩展功能的方法,可以在HQL中进行评估

(2)hive的udf分类

hive的udf一般分为三种:

a.UDF:用户定义的简单函数,按行操作并为一行输出一个结果,例如大多数内置数学和字符串函数

b.UDAF: 用户定义的聚合函数,按行或按组操作,并为每个组输出一行或一行,例如MAX和COUNT内置函数。

c.UDTF:用户定义的表生成函数也按行运行,但结果会生成多行/表,例如EXPLODE函数。 UDTF可以在SELECT之后或在LATERAL VIEW语句之后使用。

(3)hive的udf使用举例

a.对于hive的udf,这里我写了一个把字符串的大写全部换成小写和一个判断字符串是否在一个array数组里面的函数

+ View Code

b.然后通过编译器打包到hdfs文件系统上,通过执行hive命令构造函数

+ View Code

c.使用自定义函数

这里使用了另一库里的一张employee表,里面使用了string类型、array类型...。表描述与内容如下:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190109A0BZBH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券