针对Hive整理了部分资料,有需要的同学们可以看下,仅展示Hive中部分资料,如有遗漏,请谅解,希望能帮到有需要的同学!
笔者:Zaki
适用范围:掌握基本SQL语法,日常查询统计;
关系型&非关系型:关系型(二维表,行列组成,响应速度毫秒级:本地SQL),非关系型(数据体量超过GB级,多范式,每个属性都和主键有直接关系)
事务:原子性、一致性、隔离性、持久性,如账户一方增加则另一方必须减少
数据仓库:多元化系统--数据仓库--BI系统,避免BI系统对各大系统发起数据提取(攻击指令),BI属于下游系统
建表:create table;Hive中使用分隔符对每行字段进行分隔【row format delimited fields terminated by ‘,’】
Hive集合数据类型【提高数据吞吐量,达到TB/PB级】:STRUCT(通过“点”访问元素内容),MAP(键--值),ARRAY(数组,按照元素序列获取)
数据类型 | 描述 | 访问 |
STRUCT | STRUCT(firName STRING, lastName STRING) | 字段名.firName |
MAP | MAP("Salary","8000","Late","100") | 通过键获取值 |
ARRAY | ARRAY("Salary","Late") | 按元素获取,编号从0开始,同python一致 |
Hive数据库:存储以来HDFS,计算依赖MapReduce
HiveQL数据定义语言:
操作 | 语法 | 备注说明 |
建表 | create database sogou |
|
建表报错覆盖 | create database if not exists sogou |
|
查所有数据库 | show databases |
|
筛选数据库 | show databases like 's.*' |
|
创建数据库目录 | create database bank comment 'Inter Banking' | Inter Banking'作为目录的业务描述 |
删除数据库 | drop database sougou |
|
删表报错 | drop database if exists sogou | 数据库存在再删除,不存在则不 执行删除操作 |
删除执行错误 | drop database if exists enterpricse cascade | enterpricse为数据库,若存在单个数据库对应 多个表,必须先删表,加上cascade使Hive自动 优先删除表 |
查表 | show table in enterprise | 查enterprise库下的所有表 |
建外部表 | create external table | Hive控制内部表的数据生命周期,即删除内部表所有数据都清除,建立外部表在数据共享的情况下进行表删除,但其数据生命周期不受Hive控制 |
修改表 | after table tableName rename to otherTableName | 修改表名 |
删除表 | drop table if exists product | 防止执行报错 |
Hive中的分区表:
类型 | 理论 | 说明 |
MySQL | 将一张表分解成多个更小的、容易管理的部分,逻辑上只有一张表,底层是由多个物理分区组成,物理分区可以分布在不同的物理服务器上 |
|
Hive | 数据存储在HDFS上,Hive的分区是创建层级目录的一种方式 | Hive创建分区用partitioned by,此处定义的列是目录名 |
类型 | 语法 | 说明 | 区别 |
静态分区表 | partition by (sex string , native string) | 创建多个分区,分区字段的顺序决定了HDFS系统上的目录顺序(sex为父目录,native为子目录);但过滤仅为native则扫描所有的sex | 插入数据必须先知道有哪些分区类型 |
动态分区表 | 开启动态分区功能: set hive exec.dynamic.partition=True; set hive.exec.dynamic.partition.mode=nonstrict; set hice.exec.max.dynamic.partitons.prenode=1000 | 此属性的默认值为strict,意思是不允许分区列全是动态的。将其值设置为nonstrict,将所有的分区列设置为动态的;最大动态分区为1000 | 不用指定分区目录,由系统自动选择 |
Hive中的外部导入和导出:
插入符合条件的数据:insert overwrite table sgou.sougou_xj select * from sogou.sougou_500w where keyword like ‘%仙剑奇侠传%’
单个查询语句创建表并加载数据:create table sougou.sougou_xj_backup as select * from sogou.sogou_xj;
HiveQL数据查询语句(展示部分)
语法 | 区别 |
order by | 对查询结果集全局排序,消耗时间长 |
sort by | 局部排序,消耗时长短,用于数据量级较大 |
inner join | 内连接【等值连接&不等值连接】 |
join | 自然连接,2张表中寻找哪些数据类型和列名相同的字段,自动连接起来,无法匹配的记录不会保留;可以不使用on |
left outer join | 左外连接,左表查询信息全部显示,右表符合条件显示,不符合空值填充 |
right outer join | 右外连接,右表查询信息全部显示,左表符合条件显示,不符合空值填充 |
full outer join | 全外连接,查询结果为左外连接和右外连接的和 |
| 自连接,将自身表的镜像当成另外一个表 |
HiveQL数据查询进阶(内置函数&日志解析&Sqoop)
内置函数
HiveQL查询进阶 |
|
|
项目 | 类型 | 语法(部分) |
内置函数 | 数学函数 | 四则运算,ceil【向上取】,floor【向下取】 |
字符函数 | lower【转小写】,upper【转大写】,length【长度】,trim【去前后空格】 get_json_object【用于处理json格式数据】 | |
收集函数 |
| |
转换函数 | cast | |
日期函数 | to_date | |
条件函数 | case when | |
聚合函数 | count,sum,min,max,avg等 | |
表生成函数 |
|
Hive构建搜索引擎日志数据分析系统(后台常用分析用户访问情况,此处不做展示)
举例【UID分析】:select sum(IF (uids.cnt =1,1,0)) , sum(IF (uids.cnt =2,1,0)), sum(IF (uids.cnt =3,1,0)), sum(IF (uids.cnt >3,1,0)) from (select uid count(*) as cnt from sogou.sogou_ext_20111230 group by uid ) as uids;
Sqoop应用与开发(此处不做过多展示)
介绍:Sqoop是一款ETL工具,负责将大数据平台处理完的结果数据导入关系型数据库中,或者将关系型数据库中的数据导入大数据平台
Hive数据库对象与用户自定义函数
Hive数据库对象与用户自定义函数 |
|
|
项目 | 类型 | 语法(部分) |
Hive视图 | 创建视图 | create view [if not exists ] db_name.view_name as select ………… 视图是只读型,不能对视图进行插入、删除、修改等操作; 删除视图语法: drop view [if exists ] [db_name.]view_name;--结构语法 drop view if exists sogou.sogou_view |
Hive分桶表 |
| 分桶表是相对于分区来说的,根据某列字段属性值的哈希值进行区分,对字段进行取模运算,余数相同的则分配在同一个桶中,一个桶对应一个文件,而分区表则是目录; 通过clustered by(字段名) into bucket_num buckets 分桶; create table sogou_bucket(uid string, keword string) comment 'test' clustered by(uid) into 5 buckets row …………分隔符; 启动MapReduce作业方式,不能使用load data loacl inpath加载数据; set hive.enforce.bucketing=true--含义为分桶是否被强制执行; |
自定义函数UDF |
| 当前所有函数名称【包含自定义】 show functions; describe function 函数名;--函数的简介; UDF需要继承org.apache.hadoop.hive.ql.UDF,需要实现evaluate函数,该函数支持重载; |
自定义聚合函数UDAF |
| UDAF必须要继承org.apache.hadoop.hive.ql.UDAF类和实现 org.apache.hadoop.hive.ql.exec.UDAFEvaluator接口 |