什么是Hive
Hive是基于Hadoop的一个数据仓库工具,是将结构化数据文件映射称为一个数据表,并提供类SQL的查询功能
Hive的意义(最初研发的原因)
在Hadoop是个好软件,但是不好使用(学习成本高,坡度陡,难度大)的前提下
降低了程序员使用Hadoop的学习成本,降低了难度
或
避免了去写MapReduce,提供快速开发的能力,减少开发人员的学习成本
Hive内部组成模块及作用
元数据库
元数据:MetaStore
包括表名
表所属的数据库(默认是default)
表的拥有者、列/分区字段
表的类型(是否是外部表)
表的数据所在目录等
默认存储在自带的derby数据库中,推荐使用mysql存储元数据
解释器(SQL Parser):解析HQL语义
编译器(Physical Plan):将HQL根据语义转换成MapReduce程序
优化器(Query Optimizer):对逻辑执行计划进行优化(对MR程序进行优化)
执行器(Execution):把任务提交到Hadoop集群
Hive支持的数据格式
Text
SequenceFile
ParquetFile
ORC
RCFile
进入HiveShell窗口的方式
方式一
安装hive后配置系统环境变量的前提下,在节点的任意位置直接输入 hive+回车
方式二
1.启动hiveserver2: hive --service hiveserver2
2.beeline连接hiveserver2:beeline+回车
3.连接服务: !connect jdbc:hive2://node01:10000
node01表示哪个节点启动hiveserver2就写哪个节点的主机名
4.输入用户名+密码(自定义)
Enter username for jdbc:hive2://node01:10000:root
Enter password for jdbc:hive2://node01:10000:******
方式三:通过参数
1.hive -e + '命令' --->(hive -e 'show databases'):查看所有数据库
2.hive -f + 文 件 --->(文件内体检编写号查询语句:use myhive;select * from stu);hive -f hive.sql
Hive数据库,表在HDFS上存储的路径是什么
/user/hive/warehouse 存放数据库,数据库中存放数据表
Like与Rlike的区别
like不是正则,而是通配符
rlike是正则,正则的写法与java一样
内部表与外部表的区别
删除内部表会直接删除元数据及存储数据
删除外部表仅仅会删除元数据,HDFS上的文件不会被删除
分区表的优点,分区字段的要求
优点
提高特定(指定分区)查询分析的效率
要求
分区字段绝对不能出现在表已有的字段内
分桶表的有点,分区字段的要求
优点
提高join效率:
将join关联的字段作为分桶字段,相同的数据汇入到一个桶内,在join时直接读取桶内的所有数据,不要扫描全表
数据取样:
将数据编号作为分桶字段,与分桶数量取余,这样可以将数据打散,分到不同的桶内。n那么每个桶内的数据包含各个"阶段"的数据
要求
分桶字段必须出现在表已有的字段内
数据导入表的方式(五种)
方式一
直接向分区表中插入数据
格式:insert into table 表名 partition(分区字段='值') values ('数据1','数据2'....);
示例:insert into table score partition(month ='201805') values ('001','002','008');
方式二
关键字overwrite必须有,通过查询插入数据
格式:insert overwrite table 表名 partition(分区字段='值') select 表名 字段 from 表名;
示例:insert overwrite table score partition(month='201805') select s_id,s_score from score;
通过load方式加载数据
格式:load data local inpath 'Linux系统数据表存储路径' overwrite into table 表名 partition(分区字段='值');
示例:load data local inpath '/opt/hive/score.csv' overwrite into table score partition(month='201805');
方式三
多插入模式
from score
insert overwrite table score_first partition(month='201805') select s_id,c_id
insert overwrite table score_second partition(month='201805') select s_id,c_id,s_score;
方式四
查询语句中创建表并加载数据
格式:create table 表名 as select 指定字段 from 表名;
示例:create table score1 as select * from score;
方式五
创建表时通过location指定加载数据路径
格式:create external table 表名 (字段名 字段类型) row format delimited fields terminated by '分隔符' location 'HDFS存储路径';
示例:create external table score (s_id string,c_id string,s_score int) row format delimited fields terminated by '\t' location '/myscore';
数据导出表的方式(七种)
方式一
将查询的结果导出到本地
格式:insert overwrite local directory '本地路径' select 指定字段 from 表名;
示例:insert overwrite local directory '/opt/hive/a' select * from score;
方式二
将查询的结果格式化导出到本地(有local)
格式:insert overwrite local directory '本地路径' row format delimited fields terminated by '分隔符' collection items terminated by '分隔符' select 指定字段 from 表名;
示例:insert overwrite local directory 'opt/hive/aaa' row format delimited fields terminated by '\t' collection items terminated by '\t' select * from score;
方式三
将查询的结果格式化导出到HDFS(没有local)
格式:insert overwrite directory 'HDFS路径' row format delimited fields terminated by '分隔符' collection items terminated by '分隔符' select 指定字段 from 表名;
示例:insert overwrite directory '/hive/aaa' row format delimited fields terminated by '\t' collection items terminated by '\t' select * from score;
方式四
Hadoop命令导出到本地
格式:dfs -get 表中数据在HDFS上的存储位置 本地路径;
示例:dsf -get /export/servers/exporthive/000000_0 /export/servers/exporthive/local.txt;
方式五
hive shell命令导出
格式:bin/hive -e "select 指定字段 from 表名;" > 本地路径
示例:bin/hive -e "select * from myhive.score;" > /export/servers/exporthive/score.txt;
方式六
export导出到HDFS上
格式:export table 表名 to '本地路径';
示例:export table score to '/export/servers/exporthive/score';
方式七
sqoop导出数据到hive/HDFS
order by 与 sort by的区别
order by:全局排序
sort by:局部分区内进行排序
where与having的区别
where作用在表的所有字段-----having作用在查询字段
where子句中不能使用聚合函数-----having语句中可以使用聚合函数
Distribute by 何时使用,通常与哪个联合使用
按照指定的字段进行分区时,对数据进行分区时使用
通常和 sort by 联合使用,Hive要求 Distribute by 语句要写在 sort by 语句之前
Cluster by 何时使用
要根据某个字段进行分区,并且以这个字段进行排序时使用 Cluster by
Distribute by+ sort by(相同字段) 与 Cluster by的区别
Cluster by 不能定义排序规则,只能正序排列
Distribute by+sort by 可以定义排序规则
hive -e /-f /-hiveconf 分别是什么意思
hive -e 后面的参数是 '命令行'
hive -f 后面的参数是文件,文件中书写查询语句
hive -hiveconf 设置hive运行时候的参数配置
Hive声明参数的方式及优先级
方式
配置文件(配置文件参数)
hive -hiveconf(命令行参数)
在hive的shell窗口set(参数声明)
优先级
参数声明 > 命令行参数 > 配置文件参数
编写HiveUDF代码,方法的名称
evaluate
企业中Hive常用的数据存储格式是什么?常用的数据压缩格式是什么?
数据存储格式:
ORC
Parquet
数据压缩格式:
Snappy
Hive自定义函数的类型
UDF:一进一出
UDAF:聚合函数,多进一出(count、max、min)
UDTF:一进多出(lateral、view、explore)
Fetch抓取中设置more有什么效果,设置none有什么效果
设置more:
执行某些查询语句,不会执行MapReduce程序
设置none:
执行查询语句,所有的查询都会执行MapReduce程序
本地模式有什么好处
在数据量较小时,提高查询效率
原因:
查询数据的程勋运行在提交查询语句的节点上运行(不要提交到集群上运行)
当一个key数据过大导致数据倾斜时,如何处理
当数据发生倾斜时,使用局部聚合可以起到性能调优的效果(在Map端进行聚合)
Count(distinct)的替换语句如何编写
使用嵌套查询(先对 id 分组,再求组的数量)
select count(id) from (select id from bigtable group by id) a;
如何使用分区裁剪,列裁剪
分区裁剪:
用哪个分区,获取哪个分区的数据,多的不要获取
列 裁 剪:
用哪个列,获取哪个列的数据,多的不要获取
如何理解动态分区调整
以第一个表的分区规则,来对应第二个表的分区规则,将第一个表的所有分区,全部拷贝到第二个表中,第二个表在加载数据的时候,不需要指定分区,直接用第一个表的分区即可
数据倾斜时,如何将众多数据写入10个文件
方式一:
设置reduce数量为10,使用Id,对id进行分区 distribute by
方式二:
设置reduce数量为10,使用distribute by 字段为随机数
select * from a distribute by rand();
reduce数量的计算是什么
是决定reduce数量的因素
参数1:每个reduce处理的最大数据量
参数2:每个人物最大的reduce数
计算公式:N=min(参数2,总输入数据量/参数1)
并行执行有什么好处
在转换后的各个阶段,没有依赖的前提下:
可以开启并行执行(多任务多阶段同时执行),起到优化执行效率的作用
严格模式不能执行哪些命令
用户不允许扫描所有分区
使用了 order by 语句的查询,要求必须使用 limit 语句
限制笛卡尔积的查询
JVM重用有什么好处
重复利用JVM,以减少JVM开启和关闭的次数,减少任务开销,提高效率
什么是MapReduce本地计算
数据存储后,计算这批数据的程序已经写完,程序在进行分发时,有限将程序分发到程序所用到的数据所在的节点就是MapReduce的本地计算
先join后过滤的优化方案
先过滤后join
1、SELECT a.id FROM ori a
LEFT JOIN bigtable b
ON (b.id <= 10 AND a.id = b.id);
2、SELECT a.id FROM bigtable a
RIGHT JION (SELECT id FROM ori WHERE id <= 10 ) b
ON a.id = b.id;
影响Map数量的因素
当文件很小时,影响Map的数量的因素是文件的根数
当文件很大时,影响Map的数量的因素是数据块的数量
什么是MR本地模式
任务提交时,运行在提交HQL所在的节点,不提交到集群(本地计算提交到集群,本地模式不提交到集群)
Impala与Hive的关系
impala使用hive的元数据库metadata
兼容hive的绝大多数SQL语法,若要使用impala,必须启动hive的Metastore服务
什么是Impala
impala是一个SQL查询工具,提供实时的查询,基于hive并使用内存进行计算,兼顾数据仓库