Hive大数据分析

一、What

1、什么是Hive

Hive是底层封装了Hadoop的数据仓库处理工具,存在的目的是让精通SQL的分析师能够对存放在HDFS上的大规模数据集执行查询,它在工作站上运行时,将用户的HiveQL 语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。Hive把结构化的数据组织为表,通过这种方式为存储在HDFS上的数据赋予结构。

HQL是Hive的查询语言,可以看成是SQL的一种方言,受SQL影响很深。

Hadoop是一个能够对大量数据进行分布式处理的软件框架。

Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。

MapReduce:分布式数据处理模型和执行环境,应用与大型商用机集群。

HDFS:分布式文件系统,应用与大型商用机集群。


2、Hive架构

主要分为以下几个部分:

用户接口

用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是 CLI,Cli 启动的时候,会同时启动一个 Hive 副本。Client 是 Hive 的客户端,用户连接至 Hive Server。在启动 Client 模式的时候,需要指出 Hive Server 所在节点,并且在该节点启动 Hive Server。 WUI 是通过浏览器访问 Hive。

元数据存储

Hive 将元数据存储在数据库中,如 mysql、derby。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

解释器、编译器、优化器、执行器

解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行。

Hadoop

Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(不包含 * 的查询,比如 select * from tbl 不会生成 MapReduce 任务)。


3、Impala

Impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据。已有的Hive系统虽然也提供了SQL语义,但由于Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满足查询的交互性。相比之下,Impala的最大特点也是最大卖点就是它的快速。

Impala不需要把中间结果写入磁盘,省掉了大量的I/O开销。

省掉了MapReduce作业启动的开销。MapReduce启动task的速度很慢(默认每个心跳间隔是3秒钟),Impala直接通过相应的服务进程来进行作业调度,速度快了很多。

Impala完全抛弃了MapReduce这个不太适合做SQL查询的范式,而是像Dremel一样借鉴了MPP并行数据库的思想另起炉灶,因此可做更多的查询优化,从而省掉不必要的shuffle、sort等开销。


二、Why

Hive优点:

1、简单易上手:支持类SQL的查询语言,不需要分析人员写mapreduce;

2、可扩展,适用于处理大数据集:MR作为计算引擎,HDFS作为存储系统;

3、提供统一的元数据管理;

4、延展性好:支持自定义函数;

5、容错性好,节点出现问题,SQL仍可以完成执行。

Hive缺点:

1、HQL表达能力有限:优化迭代算法无法表达,数据挖掘

2、延迟性高,效率低:

默认为MR执行引擎,启动有延迟,常用于OLAP数据分析场景,不适用OLTP场景;

HQL调优困难,粒度比较粗;

Hive可控性差。


三、How

1、适用场景

作为数据仓库ETL:

数据挖掘:

用户行为分析:

文本分析:

2、HQL的数据类型

tinyint,smallint,int,bigint,float,double,boolean,string,binary,timestamp;

array,map,struct

3、HQL的操作与函数

SQL操作:关系操作,空值判断,算术操作,逻辑操作;

内置函数:数学和统计函数,字符串函数,日期函数,条件函数,聚类函数,XML函数,JSON函数

类型转换

隐式类型转换:任何整数类型都可以隐式地转换成一个范围更广的类型。所有整数类型、float和string类型都能隐式转换为double。tinyint、smallint和int都可以转换为float。boolean类型不能转换为其他数据类型,timestamp可以被隐式转换为string。

显式数据转化:使用cast进行数据类型转换。

4、表

内部表:所有的处理都由Hive完成

创建内部表:

CREATE TABLE IF NOT EXISTS table_name[(col_name data_type [COMMENT col_comment], ...)][COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)][STORED AS file_format] [LOCATION '/mso/export/test']

加载数据:

加载本地数据:Load data local inpath '/......' into tablename;

加载HDFS数据  load data inpath 'hdfs://.....' into tablename

查看HDFS数据:

操作数据库:

外部表:要使用hive和其他工具来处理同一个数据集

分区和分桶:partitioned by,clustered by[column name] into x buckets

存储格式:没有用 row format 或者 started as 字句声明的时候,Hive默认为分隔的文本格式,每行存储一个row

导入数据:

load data:通过把文件复制或者移到表的目录中,从而把数据导入hive的表或者分区

insert:把数据从一个hive表填充到另一个hive表:insert overwrite table tablename select col1,col2 from source

对于分区的表,可以使用partition子句来指明数据要插入哪个分区:insert overwrite table tablename partition(dt=' ') select col1,col2 from source

多表插入:把insert语句倒过来,from放在最前面,这样可以在同一个查询中使用多个insert语句。效率更高,因为只要扫描一遍源表就可以生成多个不相交的输出。

from source 

insert overwrite table tablename select col1,count(distinct col2) group by col1

insert overwrite table tablename1.....

create table...as select:将输出结果存放到一张新表非常方便。select语句失败,新表就不会被创建。

表的修改:

1、重命名:使用 alter table source rename  to target 重命名表

2、新增一个表列:alter table target add columns(col3 string)

表的丢弃:

1、删除表的数据和元数据:drop table  

查询数据:

1、排序和聚类:order by   sort by  distribute by

from records select year,temperature distribute by year sort by year asc,temperature desc

2、连接:Hive 只能使用等值连接,hive不允许在select 语句的from字句中列出要连接的表,或者在where字句中指定连接的条件。

内连接:join 

外连接:left outer join,right outer join,full outer join

半连接:相当于 in   select * from a left semi join on sales on 

3、视图表

4、用户定义函数UDF,必须用Java写!


四、HQL的顺序与调优

1、Hive函数的执行顺序:https://www.cnblogs.com/jiangxiaoxian/p/7155636.html

from + 表名

on +字段

(left/right)join +表名

where +条件

group by +字段

having + 条件

select +字段

distinct +字段

union +结果集

order by +字段

limit +数量

2、窗口函数:https://blog.https://www.cnblogs.com/jiangxiaoxian/p/7155636.html.net/qq_26937525/article/details/54925827

3、分析函数

4、日期函数:https://blog.csdn.net/u013421629/article/details/80450047

5、优化

分区表-提高查询(partition)

列式存储(parquet和orc)

表连接优化(将大表放后面)

尽早的过滤数据

尽量原子化操作(避免复杂的语句,建议使用临时表来过渡)

如果要用到union into 替换成insert into(性能能提上50%)

order by 改为 sort by (全局排序改为局部排序)

数据倾斜

6、详解参考:https://blog.csdn.net/scgaliguodong123_/article/details/60135385

你可能感兴趣的:(Hive大数据分析)