Hive知识点总结--持续更新

什么是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并使用内存进行计算,兼顾数据仓库
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值