一、HBase
1、HBase特点
Hbase是构建在HDFS上的分布式数据库,提供 高可靠性 、 高性能 、 列存储 、 可伸缩 、 实时读写 的分布式数据库系统。HBase主要用于大数据领域,MySQL 是行式存储,HBase 是列式存储。
HBase 是一种构建在 HBase 之上的分布式、面向列的存储系统,需要实时读写、随机访问超大规模数据集时,可以使用HBase。
HDFS不支持小文件,不支持并发写,不支持文件随机修改,查询效率也低 。HBase 却是一个支持百万级别高并发写入,支持实时查询,适合存储稀疏数据的分布式数据库系统。
(1)海量存储、扩展性强、高可靠性
· 海量存储:
HBase 单表可以有百亿行、百万列,可以在横向和纵向两个维度插入数据,具有很大的弹性。
- 当关系型数据库的单个表的记录在亿级时,查询和写入的性能都会呈现指数级下降,这种庞大的数据量对传统数据库来说是一种灾难,而HBase 在限定某个列的情况下对于单表存储百亿甚至更多的数据都没有性能问题;
- HBase 采用 LSM 树作为内部数据存储结构,这种结构会周期性地将较小文件合并成大文件,以减少对磁盘的访问。
· 扩展性强:
依赖HDFS,当磁盘空间不足的时候,只需要动态增加datanode节点就可以了,可以通过增加服务器来对集群的存储进行扩容;
- HBase工作在 HDFS 之上,理所当然地支持分布式表,也继承了 HDFS 的可扩展性。HBase
的扩展是横向的,横向扩展是指在扩展时不需要提升服务器本身的性能,只需添加服务器到现有集群即可。- HBase表根据 Region大小进行分区,分别存在集群中不同的节点上,当添加新的节点时,集群就重新调整,在新的节点启动 HBase 服务器,动态地实现扩展。这里需要指出,HBase 的扩展是热扩展,即在不停止现有服务的前提下,可以随时添加或者减少节点。
· 高可靠性
HBase运行在 HDFS 上,HDFS 的多副本存储可以让它在岀现故障时自动恢复,同时 HBase 内部也提供 WAL 和 Replication 机制。
- WAL(Write-Ahead-Log)预写日志,是在 HBase服务器处理数据插入和删除的过程中用来记录操作内容的日志,保证了数据写入时不会因集群异常而导致写入数据的丢失;而 Replication 机制是基于日志操作来做数据同步的。
- 当集群中单个节点出现故障时,协调服务组件ZooKeeper通知集群的主节点,将故障节点的 HLog 中的日志信息分发到各从节点进行数据恢复。
(2)列式存储、稀疏性、数据多版本、数据类型单一
· 列式存储:
-HBase表的数据是基于列族进行存储的,列族是在列的方向上的划分,每个列族是单独存储的,且支持基于列的独立检索。
· 稀疏性:
主要是针对HBase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的,在很大程度上节省了存储开销。
· 数据多版本:
表中数据可以有多个版本值,默认情况下是根据版本号去区分,版本号就是插入数据的时间戳
· 数据类型单一:
所有的数据在HBase中是以字节数组进行存储
·(3)高并发:支持高并发的读写请求
·启动时,需要提前启动HDFS及 ZooKeeper集群
2、架构原理
HMaster -> HRegionServer -> Region
rowkey行键 -> Column Family列族 -> Column列 -> cell单元格 -> Timestamp时间戳
·(1)Client客户端 :Client是操作HBase集群的入口
管理类 操作请求,如表的增删改操纵,Client通过RPC与HMaster通信完成;
表数据 读写操作请求,Client通过RPC与RegionServer交互,读写数据;
Client类型:HBase shell、Java编程接口、Thrift、Avro、Rest等等;
·(2)ZooKeeper集群:
- 实现了HMaster的高可用,多HMaster间进行主备选举;
- 保存HBase元数据信息meta表, 元数据region的寻址入口 ;
- 对HMaster和HRegionServer实现了监控,上下线;
·(3)HMaster:region的分配维护,表的请求相应
关于Table:响应Client对Table的增删改请求的操作
关于Region:
- 新Region分配到指定的HRegionServer上;
- 维护HRegionServer间的负载均衡 ;
- HRegionServer宕机后,负责 region 迁移;
·(4)HRegionServer,表的读写,region的
- 响应客户端的读写数据请求;
- 负责管理master为其分配的Region;
- Region的拆分,storefile合并;
- 与HDFS底层交互,存储数据;
·(5)Region:HBase集群中分布式存储的最小单元
Region是HBase集群中分布式存储的最小单元,一个Region对应一个Table表的部分数据。
memstore是一块 内存区域,写入的数据会先写入memstore进行缓冲,然后再把数据刷到磁盘;
StoreFile是HFile的抽象对象,如果说到StoreFile就等于HFile,每次memstore刷写数据到磁盘,就生成对应的一个新的HFile文件出来
一个HRegionServer会负责管理很多个region ,一个region包含很多个store,一个列族就划分成一个store,一个store里面只有一个memstore,有很多个 StoreFile ,最后数据是以很多个 HFile 这种数据结构的文件保存在HDFS上。
3、读写过程
Hbase读数据
- 1、客户端首先与zk进行连接,从zk找到包含meta表的HRegionServer,连接此包含HRegionServer,读取meta表中的数据;
- 2、根据要查询信息,先找到数据对应的region信息,在找到这个region对应的regionServer,然后发送请求
- 3、查找并定位到对应的region,
- 4、先从memstore查找数据—如果没有从BlockCache上读取----如果也没有再到StoreFile上进行读取。
- 5、从storeFile中读取到数据之后,不是直接把结果数据返回给客户端,而是把数据先写入到BlockCache中,目的是为了加快后续的查询;然后在返回结果给客户端。
Hbase写数据
- 1、客户端首先与zk进行连接,从zk找到zk找到meta表的region位置,即包含meta表的HRegionServer,连接此包含HRegionServer,读取meta表中的数据;
- 2、根据要查询信息,先找到数据对应的region信息,在找到这个region对应的regionServer,然后发送请求
- 3、查找并定位到对应的region,
- 4、写数据时,把数据分别写到HLog 和memstore各一份进行缓冲,
- 5、flush:memstore达到阈值后,把数据刷到磁盘生成多个storeFile文件。
- Region中任意一个memstore达到128MB
- Region中所有Memstore的大小总和达到block.multiplier * flush.size
- Region Server中HLog数量达到上限
- 6、compact:
- 小合并:小的store file合并成相对较大的store file,
- 大合并:合并Store中所有的HFile为一个HFile
4、flush刷写
为了减少flush过程对读写的影响,将整个flush过程分为三个阶段:
①prepare阶段: 将Memstore中当前数据集做一个快照snapshot;再新建一个数据集CellSkipListSet。后期写入的数据都会写入新的CellSkipListSet中。
②flush阶段:将prepare阶段生成的snapshot持久化为临时文件,统一放到目录.tmp下。涉及到磁盘IO操作,相对比较耗时。
③commit阶段:将flush阶段生成的临时文件移到指定的ColumnFamily目录下,针对HFile生成对应的storefile和Reader,最后再清空prepare阶段生成的snapshot。
触发条件:
- ①一个MemStore的大小达到了上限128m
- ②一个Region中所有Memstore总和达到了上限,128*个数
- ③一个Region Server中所有Memstore总和超过低水位阈值
- ④一个Region Server中HLog数量达到上限
- ⑤定期1小时刷新Memstore
- ⑥通过shell命令flush ‘tablename’或者flush ‘region name’,手动刷写
5、campact合并
为防止小文件过多,以保证查询效率,需将这些小的store file合并成相对较大的store file,这个过程就称之为compaction。
小合并:将一些小的、相邻的StoreFile,合并成一个更大的StoreFile,对于超过了TTL的数据、更新的数据、删除的数据仅仅只是做了标记,并没有进行物理删。一次结果是更少并且更大的StoreFile,触发频率很高。
大合并:将所有的StoreFile合并成一个StoreFile, 清理三类无意义数据:被删除的数据、TTL过期数据、版本号超过设定版本号的数据。合并频率比较低,默认7天执行一次,并且性能消耗非常大,建议生产关闭(设置为0),在应用空闲时间手动触发。一般可以是手动控制进行合并,防止出现在业务高峰期。
6、region拆分
- ①0.94版本前默认,region大小大于某个阈值10G;
- ②0.94~2.0版本默认,大小递增,regioncount^3 * 128M * 2,256M 2048M 6912M 10G;
- ③2.0版本默认,如果region个数等于1, 切分阈值为flush size * 2,否则为MaxRegionFileSize;
- ④根据rowKey前缀对数据进行分组
7、预分区
当一个table刚被创建的时候,Hbase默认的分配一个region给table。 说这个时候,所有的读写请求都会访问到同一个regionServer的同一个region中,这个时候就达不到负载均衡的效果了,集群中的其他regionServer就可能会处于比较空闲的状态。
在创建table的时候就配置好预分区,生成多个region。增加数据读写效率;负载均衡,防止数据倾斜;方便集群容灾调度region;优化Map数量
每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护。
8、rowkey设计三原则
长度原则、散列原则、唯一原则
rowkey长度原则
- rowkey是一个二进制码流,可以是任意字符串,最大长度64kb,实际应用中一般为10-100bytes,以byte[]形式保存,一般设计成定长。
- 建议尽可能短;但是也不能太短,否则rowkey前缀重复的概率增大;
- 设计过长:会降低memstore内存的利用率和HFile存储数据的效率。
rowkey散列原则:
- 建议将rowkey的高位:作为散列字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。
- 如果没有散列字段,首字段直接是时间信息。所有的数据都会集中在一个RegionServer上,这样在数据检索的时候负载会集中在个别的RegionServer上,造成热点问题,会降低查询效率。
rowkey唯一原则:
- 必须在设计上保证其唯一性,rowkey是按照字典顺序排序存储的;因此,设计rowkey的时候,要充分利用这个排序的特点,可以将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块
9、什么是热点
检索habse的记录,首先要通过rowkey来定位数据行。当大量的client访问hbase集群的一个或少数几个节点,造成少数regionserver的读/写请求过多、负载过大,而其他region server负载却很小,就造成了“热点”现象。
热点的解决方案(预分区、加盐、哈希、反转)
- 预分区:目的让表的数据可以均衡的分散在集群中,而不是默认只有一个region分 布在集群的一个节点上。
- 加盐:在rowkey的前面增加随机数,具体就是给rowkey分配一个随机前缀以使得 它和之前的rowkey的开头不同
- 哈希:使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读 却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使 用get操作准确获取某一个行数据。
- 反转:反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的 部分(最没有意义的部分)放在前面。
10、协处理器
Hbase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。比如,在旧版本的(<0.92)Hbase 中,统计数据表的总行数,需 要使用 Counter 方法,执行一次 MapReduce Job 才能得到。
虽然HBase在数据存储层中集成了 MapReduce,能够有效用于数据表的分布式计算。然而在很多情况下,做一些简单的相加或者聚合计算的时候, 如果直接将计算过程放置在server端,能够减少通讯开销,从而获得很好的性能提升。
于是,HBase在 0.92 之后引入了协处理器(coprocessors),实现一些激动人心的新特性:能够轻易建立**二次索引、复杂过滤器(谓词下推)**以及访问控制等。
协处理器有两种:Observer协处理器 endpoint协处理器
- Observer协处理器: 类似于传统数据库中的触发器,主要在服务端工作;允许集群在正常的客户端操作过程中,可以有不同的行为表现;可以实现权限管理、优先级设置、监控、ddl控制、 二级索引等功能。
- endpoint协处理器;类似于传统数据库中的存储过程,主要在client端工作;允许扩展集群的能力,对客户端应用开放新的运算命令;可以实现min、 max、 avg、 sum、 distinct、 group by 等功能
协处理器的加载方式有两种:静态加载修改hbase-site.xml ;动态加载启用表aggregation,只对特定的表生效。
11、HBase shell
12、HBase优化
二、Hive
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。本质是将SQL转换为MapReduce任务进行运算,底层由HDFS来提供数据的存储,可以理解就是一个MapReduce的客户端,通过解析hql语句,实现hdfs上面的数据的查询操作,真实的数据保存在hdfs上面的,数据的计算,使用的mr的程序。每执行一次查询,不一定会有对应的mr任务执行,有些查询,不需要mr的参与;
hive当中建库建表的元数据信息保存在mysql里面;
Hive只适合用来做海量离线数据统计分析,也就是数据仓库。
1、怎么把hive翻译成的mr的
主要就是通过解析器的,就是将sql语法解析成为mr的任务
- 解析器(SQL Parser)
- 将SQL字符串转换成抽象语法树AST
- 对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误
- 编译器(Physical Plan):将AST编译生成逻辑执行计划
- 优化器(Query Optimizer):对逻辑执行计划进行优化
- 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说默认就是mapreduce任务
2、hive优缺点
优点:
(1)操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
(2)避免了去写MapReduce,减少开发人员的学习成本。
(3)Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
缺点:
(1)Hive 不支持记录级别的增删改操作;
(2)Hive 的查询延迟很严重;
(3)Hive 不支持事务;
3、Hive和数据库比较
Hive 和数据库除了拥有类似的sql查询语言,再无类似之处。
1)数据存储位置
- Hive 存储在 HDFS 。数据库将数据保存在块设备或者本地文件系统中。
2)数据更新
- Hive中不建议对数据的改写。而数据库中的数据通常是需要经常进行修改的,
3)执行延迟
- Hive 执行延迟较高。数据库的执行延迟较低。当然,这个是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。
4)数据规模
- Hive支持很大规模的数据计算;数据库可以支持的数据规模较小。
4、hive几种表
- ①内部表:创建内部表的时候,没有external关键字;删除内部表的时候,会同步的删除hdfs的数据。DW层
- ②外部表:创建外部表的时候有external关键字;删除外部表的时候,不会删除hdfs的数据外部表删的只是表结构,数据存在hdfs,元数据在mysql。ODS层
- ③分区表:就是
分文件夹
,实际工作当中,数据一般都是按照每天进行采集的,每天的数据都会放到某一个日期文件夹。 - ④分桶表:就是
分文件
,将一个大的文件分成多个小的文件,每个文件里面保存部分数据,到时候如果需要获取数据的时候,可以直接从对应的文件里面获取即可。
- 分桶将整个数据内容,按照某列属性值取hash值进行区分,具有相同hash值的数据进入到同一个文件中。可以过滤掉大量不相关的文件,提高查询效率。
Hive分区分桶区别
- 分区是表的部分列的集合,可以为频繁使用的数据建立分区,这样查找分区中的数据时就不需要扫
描全表,这对于提高查找效率很有帮助。 - 不同于分区对列直接进行拆分,桶往往使用列的哈希值对数据打散,并分发到各个不同的桶中从而
完成数据的分桶过程。 - 分区和分桶最大的区别就是分桶随机分割数据库,分区是非随机分割数据库。
5、4个By区别
- 1)order by:全局排序,只有一个reduce,和你设多少个reduce个数无关;
- 缺点:当数据量非常大时,耗时太长,效率低下,适用于数据量较小的场景;
- 优点:数据全局排序;
- select * from emp order by sal desc;
- 2)sort by:对每一个reducer内部的数据进行排序,全局结果集来说不是排序的。适用于数据量较大,但对排序要求不严格的场合,可以大幅度提升执行效率。
- 需要你预先设置reduce个数,结果各个reduce文件内部有序,全局无序;
- set mapreduce.job.reduces=3;
set mapreduce.job.reduces;
select * from emp sort by deptno desc;
- 3)distribute by:分发,控制特定的key到指定的reducer,方便后续的聚集操作,类似MR中partition(自定义分区),一般结合sort by使用;
- set mapreduce.job.reduces=3;
select * from emp distribute by deptno sort by empno desc;- 需要设置reduces的数量为分区的数量,否则不会启动相应的reducer去进行任务的执行,这最终会导致不能完全分区;
- distribute by的分区规则是根据分区字段的hash码与reduce的个数进行模除后,余数相同的分到一个区。
- Hive要求distribute by语句要写在sort by语句之前;
- 4)Cluster By:聚集,当distribute by和sorts by字段相同时,可以使用cluster by方式。
- cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。
- 以下两种写法等价
select * from emp cluster by deptno;
select * from emp distribute by deptno sort by deptno;
实际需求
现在有一亿条数据,比如people_info,取出财富最高的前100位;
分析:显然需要排序,首先想到用order by,可是显然不行,order by 效率太低,耗时太长;现在思考能不能先走多个reduce,区内有序,最后再全局排序;
具体实现:
select * from
(select id, name, money from peopel _info
distribute by loc sort by money limit 100) tmp
order by money limit 100;
备注:这里loc字段是peopel _info 里面自身就有的,如果没有你需要自己添加类似字段,比如level(按money
大小分level,可以用case when 函数,最终可以distribute by level sort by money
),这里方便记忆可以简单这么记,先distribute by sort by ,最后再order by ;
6、hive加载数据
一般都不推荐insert,实际工作当中 都是使用load方式来加载数据到内部表或者外部表
-
1)直接
insert into
向表中插入数据(不推荐)
insert into table score3 partition(month =‘201807’) values (‘001’,‘002’,‘100’); -
2)通过
load方式
加载数据
load data local inpath ‘/datas/score.csv’ overwrite into table score3 partition(month=‘201806’); -
3)通过
查询方式
加载数据
insert overwrite table score5 partition(month = ‘201806’) select s_id,c_id,s_score from score; -
4)查询语句中创建表并加载数据(
as select
)
create table score6 as select * from score; -
5) 创建表时通过
location指定
加载数据路径
create external table score7 (s_id string,c_id string,s_score int) row format delimited fields terminated by ‘\t’ location ‘/myscore7’; -
6) export导出与import 导入 hive表数据(内部表操作)
create table teacher2 like teacher;
export table teacher to ‘/kkb/teacher’;
import table teacher2 from ‘/kkb/teacher’;
7 、复合数据类型
类型名称 | 描述 | 举例 |
---|---|---|
array | 一组有序字段,字段类型必须相同 | Array(1,2,3) |
map | 一组无序键值对 map(k1,v1,k2,v2) | Map(‘a’,1,‘b’,2) |
struct | 一组命名的字段,字段类型可以不同 | Struct(‘a’,1,2,0) |
-
array字段的元素访问方式:
-
下标获取元素,下标从0开始
-
-
map字段的元素访问方式
- 通过键获取值,获取a这个key对应的value:map[‘a’]
- 通过键获取值,获取a这个key对应的value:map[‘a’]
-
struct字段的元素获取方式
- 定义一个字段c的类型为struct{a int;b string}
- 定义一个字段c的类型为struct{a int;b string}
8、hive调优
① 开启Fetch抓取:对某些情况的查询可以不必使用MapReduce计算,在全局查找、字段查找、limit查找等都不走mapreduce。
把hive-default.xml.template文件中hive.fetch.task.conversion设置成more,然后执行查询语句,查询方式都不会执行mr程序。默认是more,(老版本minimal);设置成none,然后执行查询语句,都会执行mapreduce程序
② 开启本地模式:如果数据量小,只启动一个Maptask
默认情况下是启用hadoop的job模式,把任务提交到集群中运行,这样会导致计算非常缓慢;开启本地模式,并执行查询语句
set hive.exec.mode.local.auto=true; //开启本地mr
③ 开启并行执行,把一个sql语句中没有相互依赖的阶段,并行去运行,提高集群资源利用率配置:set hive.exec.parallel=true; set hive.exec.parallel.thread.number=16;
④开启严格模式,防止用户执行,那些可能意想不到的不好的影响的查询。
配置:set hive.mapred.mode=strict;默认是非严格模式nonstrict
开启严格模式,可以禁止3种类型的查询。对于分区表,除非where语句中含有分区字段过滤条件来限制范围,否则不允许执行对于使用了orderby语句的查询,要求必须使用limit语句
⑤ 开启数据的压缩,Hive表中间数据压缩Hive表最终输出结果压缩
⑥ 限制笛卡尔积的查询 ,笛卡尓积,又称直积,表示为两个集合X和Y的X × Y
⑦ 表的join优化
- 大表join大表 时,空 key 过滤,空 key 赋一个随机的值;
- map join,在Map端先进行部分聚合,最后在Reduce端得出最终结果;
- count distinct,使用先group by 再count的方式替换;多个表关联时,最好分拆成小段,避免大sql(无法控制中间Job);
- 老版本hive,大小表 join 时,小表放在join的左边;
⑧ 使用分区剪裁、列剪裁,尽可能早地过滤掉尽可能多的数据量,避免大量数据流入外层SQL。尽量使用分区过滤,少用select *
⑨ 避免数据倾斜:合理设置Map数 ;合理设置Reduce数;小文件合并;复杂文件增加Map数 ;
9、元数据管理
- 元数据:Metastore
- 包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
- 默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore
1)、内置derby存储
- 不同路径启动hive,每一个 hive 拥有一套自己的元数据,无法共享hive服务和metastore服务运行在同一个进程中,derby服务也运行在该进程中.内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。
- 在哪个目录下启动,就会在对应的目录下生成 derby.log 和 metastore.db,只有在此目录下再次启动才可以继续使用上次的元数据库。
- 这个是默认的,配置简单,但是一次只能一个客户端连接,适用于用来实验,不适用于生产环境。
2)、本地模式(Local):本地安装mysql 替代derby存储元数据;
不再使用内嵌的Derby作为元数据的存储介质,而是使用其他数据库比如MySQL来存储元数据。hive服务和metastore服务运行在同一个进程中,mysql是单独的进程,可以同一台机器,也可以在远程机器上。
这种方式是一个多用户的模式,运行多个用户client连接到一个数据库中。这种方式一般作为公司内部同时使用Hive。每一个用户必须要有对MySQL的访问权利,即每一个客户端使用者需要知道MySQL的用户名和密码才行。
3)、远程模式(Remote): 远程安装mysql 替代derby存储元数据;
- Hive服务和metastore在不同的进程内,可能是不同的机器,该模式需要将hive.metastore.local设置为false,将hive.metastore.uris设置为metastore服务器URL远程元存储需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。
- 将metadata作为一个单独的服务进行启动。各种客户端通过beeline来连接,连接之前无需知道数据库的密码。
- 仅连接远程的mysql并不能称之为“远程模式”,是否远程指的是metastore和hive服务是否在同一进程内。
10、常用函数
1)查看系统自带的函数 hive> show functions;
2)显示自带的函数的用法 hive> desc function upper;
3)详细显示自带的函数的用法 hive> desc function extended upper;
(1)空字段赋值,nvl( value,default_value)
- 如果员工的 comm 为 NULL,则用-1 代替
- select comm,nvl(comm, -1) from emp;
(2)字符串拼接, concat,concat_ws,collect_set,( 行转列 )
- CONCAT(string A/col, string B/col…) 如:concat(“a”,“-”,“b”,“-”,“c”)
- CONCAT_WS(separator, str1, str2,…)如:concat_ws(“-”,“a”,“b”,“c”)
- COLLECT_SET(col):只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生 Array 类型字段。
- CONCAT_WS(“|”,collect_set(t1.name))
(3)拆分成多行,exploded,lateral view,(列转行)
- explode(col)炸开:将 一列中复杂的 Array 或 Map 结构拆分成多行。
- lateral view侧写,将原本汇总在一条(行)的数据拆分成多条(行)成虚拟表,再与原表进行笛卡尔积,从而得到明细表。
- lateral view用于和 split, explode 等 UDTF 一起使用,将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
- lateral view explode(split(col_C,‘分隔符’)) tmp_table as tmp_col
(4)日期函数: datediff,date_add,date_sub ,next_day
- 日期比较函数: datediff(string enddate, string startdate)
select datediff(‘2012-12-08’,‘2012-05-09’) from tableName; 213- 日期增加函数:date_add(string startdate, int days)
select date_add(‘2012-12-08’,10) from tableName; 2012-12-18- 日期减少函数: date_sub (string startdate, int days)
select date_sub(‘2012-12-08’,10) from tableName; 2012-11-28- next_day函数
取当前天的下一个周一:select next_day(‘2019-02-12’,‘MO’);
取当前周的周一:select date_add(next_day(‘2019-02-12’,‘MO’),-7);- last_day函数(求当月最后一天日期)select last_day(‘2019-02-10’);
(5)json解析 get_json_object
- get_json_object(string json_string, string path), 返回值: string
- 解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。
-select get_json_object(‘{“store”:{“fruit”:[{“weight”:8,“type”:“apple”},{“weight”:9,“type”:“pear”}],“bicycle”:{“price”:19.95,“color”:“red”}
},“email”:“amy@only_for_json_udf_test.net”,“owner”:“amy”}’,'$.owner’) from tableName;
(6)having 与 where 不同点
-
where后面不能写分组函数,而having后面可以使用分组函数
-
having只用于group by分组统计语句
-
where针对表中的列发挥作用 ,查询数据;having针对查询结果中的列发挥作用,筛选数据。
-
select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;
11、窗口函数over()
over(),指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化
- 1)over() group by,给每一条数据都开全量窗口
- 2)over(partition by .),分区分组窗口
- 3)over(partition by . order by . ),分区分组,开始行到当前行的窗口
- 4)lag() over(partition by . order by . ),分区分组,开始行到当前行的窗口, 操作为上移下移几行
- 5)ntile(n) over(order by),把有序窗口的行分发到指定数据的组中
- 6)rank() over(partition by . order by . ) ,分组排序
LAG、LEAD是写在over前边的,(求用户的单跳转换率)
- LAG(col,n,default_val):往前第 n 行数据
- LEAD(col,n, default_val):往后第 n 行数据
如:3个人,两人并列第一
- RANK() 排序相同时会重复,总数不会变,1 、1 、 3
- DENSE_RANK() 排序相同时会重复,总数会减少,1、1、2
- ROW_NUMBER() 会根据顺序计算,1、2、3
具体
12、UDF、UDAF、UDTF函数
- 用户自定义函数UDF(User-defined functions),简单说就是输入一行输出一行的自定义算子。 (一对一)map,时间转化。
- 用户定义的聚合函数UDAF(User Defined Aggregate Function), 聚合函数是接受一组(一般是多行)输入然后产生一个输出,即将一组的值想办法聚合一下。(多对一),如max、min等,roup by一起使用,
- 用户自定义生成函数UDTF(User-Defined Table-Generating Functions)。它就是输入一行输出多行的自定义算子,可输出多行多列,又被称为 “表生成函数”。(一对多),如explode,与lateral view
- UDAF可以跟group by一起使用,也可以不跟group by一起使用,如max、min等聚合函数,
- 可以: select max(foo) from foobar group by bar; 表示根据bar字段分组,然后求每个分组的最大值,这时候的分组有很多个,使用这个函数对每个分组进行处理,
- 也可以:select max(foo) from foobar; 这种情况可以将整张表看做是一个分组,然后在这个分组(实际上就是一整张表)中求最大值。
- 所以聚合函数实际上是对分组做处理,而不关心分组中记录的具体数量。
- 自定义 :用UDF函数解析公共字段;用UDTF函数解析事件字段。
自定义UDF步骤:定义一个类继承UDF,重写evaluate方法
自定义UDTF步骤:定义一个类继承GenericUDTF,重写初始化方法、关闭方法和process方法。
1)代码
2)将jar包添加到Hive的classpath
add jar /kkb/install/hive-1.1.0-cdh5.14.2/lib/hive-function-1.0-SNAPSHOT.jar;
3)创建临时函数与开发好的java class关联
create temporary function base_analizer as ‘com.bigdata.udf.BaseFieldUDF’;
create temporary function flat_analizer as ‘com.bigdata.udtf.EventJsonUDTF’;
13、SparkSQL整合hive
由于hive原生是基于MapReduce的,导致其查询耗时较长。为了保留Hive的架构解决方案,并优化查询速度,采用SparkSql与hive整合(spark on hive),通过SparkSql读取hive中表的元数据,把HiveHQL底层采用MapReduce处理任务导致性能慢的特点,改为更加强大的Spark引擎来进行相应的计算处理。
Spark SQL的其中一个分支就是Spark on Hive,就是使用Hive中HQL的解析逻辑、执行计划翻译、执行计划优化等逻辑,近似认为仅将物理执行计划从MR作业替换成了Spark作业。
Spark SQL整合hive:就是获取hive表中的元数据信息(在mysql中),然后通过Spark SQL来操作数据。
整合步骤:文章来源:https://www.toymoban.com/news/detail-470257.html
1)、拷贝hive配置文件到spark
hive目录中conf目录下的hive-site.xml,hive的元数据信息在node03的mysql数据库中,而整合需要spark能够读取找到Hive的元数据以及数据存放位置
2)、拷贝mysql驱动到spark
3)启动:启动HDFS,YARN集群;启动spark集群;启动hive;启动spark sql
可以像在spark-sql中操作hive中的数据库和表,表明整合成功。文章来源地址https://www.toymoban.com/news/detail-470257.html
到了这里,关于Hbase/Hive知识概要的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!