FAQ
- 你在工作中使用hive比较多,那么能不能简单介绍一下hive?
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
Hive存放的是:表(数据+元数据)存的是hdfs的映射关系;hive是逻辑上的数据仓库,实际操作的都是hdfs上的文件。Hql就是用sql语法来写的mapreduce程序。
- hive你是如何优化的?如果遇到数据倾斜问题,你这边有没有一些好的解决放俺?
答:一优化数据倾斜:增大map数和重新分布数据
二表连接优化(大表放后头;使用相同连接键,只会产生一个Reduce job;尽量尽早的过滤数据;尽量原子化操作)
三insert into 替换 union all 注释:每个union数据量大,拆成insert into语句,性能提升50%
四order by & sort by 局部排序提高效率;order by 查询结果 全局排序,耗时长;
五transform+python 嵌入式在hive取留过程中的自定义函数,hive中不能实现功能,在python实现
数据倾斜的原因:key的分布不均匀和sql语句本身有数据倾斜
- Hive安装时,元数据库你们是放道哪里了?如何实现的多个客户端共享一个元数据库?
答:在生产环境中,hive的元数据库一般都放置在Mysql,derby中。
Hive的元数据就是hive的一些基本的元素,主要包括hive表的基本属性<1>hive表的数据库名,表名,字段名称与类型。
Hive中的元数据包括表的名字,表的列,和分区及其属性,表的属性(是否为外部表),表的数据所在目录。
Hive的元数据需要不断的更新、修改,HDFS系统中的文件是多读少改,显然不能将Hive元数据存储在HDFS中,目前Hive将元数据存储在数据库中,如Mysql,Derby中。
4、平时写过hive相关的脚本么?比如:python的或者shell的,如果写有,你在工作中是如何
使用这些脚本的?
5、如何创建一个表,并且存储模式需要使用orcfile?外部表和内部表的区别是什么?在创建
表时,怎么指定分区?能不能简单说一下分区?
答:外部表和内部表的区别是什么?
首先二者不是共存关系也不是修改关系,而是一开始创建表的使用要想好你到底需要什么样的表。然后,1.在导入数据到外部表,数据并没有移动到自己的数据仓库目录下(如果制定了location的话),也就是说外部表中的数据并不是由它自己来管理的!而内部表则不一样;
- 在删除内部表的时候,Hive将会把属于表的元数据和数据全部删除掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!
- 在创建内部表或外部表时加上location的效果是一样的,只不过表目录的位置不同而已,加上partition用法也一样,只不过表目录下会有分区目录而已,load data local inpath 直接把本地文件系统的数据上传到hdfs上,有location上传到location指定的位置上,没有的话上传到hive默认配置的数据仓库中。
- 外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据
问:在创建表的时候,怎么指定分区?能不能简单说一下分区?
一、为什么要创建分区表
1、select查询中会扫描整个表内容,会消耗大量时间。由于相当多的时候人们只关心表中的一部分数据,
故建表时引入了分区概念。
2、hive分区表:是指在创建表时指定的partition的分区空间,若需要创建有分区的表,
需要在create表的时候调用可选参数partitioned by,详见表创建的语法结构。
二、实现创建、删除分区表
注意:
1、一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。
2、hive的表和列名不区分大小写(故建表时,都是小写)
3、分区是以字段的形式在表结构中存在,通过"desc table_name"命令可以查看到字段存在,该字段仅是分区的标识。
4、建表的语法(建分区可参见PARTITIONED BY参数):
CREATE [EXTERNAL] 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], ...)]
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
5、分区建表分为2种,一种是单分区,也就是说在表文件夹目录下只有一级文件夹目录。另外一种是多分区,表文件夹下出现多文件夹嵌套模式。
a、单分区建表语句:create table test_table (id int, content string) partitioned by (dt string);
单分区表,按天分区,在表结构中存在id,content,dt三列。
b、双分区建表语句:create table test_table_2 (id int, content string) partitioned by (dt string, hour string);
双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
6、增加分区表语法(表已创建,在此基础上添加分区):
ALTER TABLE table_name ADD partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ... partition_spec: : PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
用户可以用 ALTER TABLE ADD PARTITION 来向一个表中增加分区。当分区名是字符串时加引号。例:
ALTER TABLE test_table ADD PARTITION (dt='2016-08-08', hour='10') location '/path/uv1.txt' PARTITION (dt='2017-08-08', hour='12') location '/path/uv2.txt';
- join优化做过吗?有哪些优化点?
答:hive的join有leftjoin、rightjoin、fulljoin等
表连接优化 (join)
1. 将大表放后头
Hive假定查询中最后的一个表是大表。它会将其它表缓存起来,然后扫描最后那个表。
因此通常需要将小表放前面,或者标记哪张表是大表:/*streamtable(table_name) */
2. 使用相同的连接键
当对3个或者更多个表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。
3. 尽量尽早地过滤数据
减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段。
4. 尽量原子化操作
尽量避免一个SQL包含复杂逻辑,可以使用中间表来完成复杂的逻辑
- Hive中使用group by子句应该注意哪些内容?
答:
8、Hive中如何实现行转列和列转行?使用行转列时需要注意哪些内容?
9、在工作中有没有使用过函数?都有哪些?能简单说一下你印象最深刻的一个函数的使用
吗?
10、自定义函数用过吗?UDF和UDAF以及UDTF的区别?
11、hive支持子查询吗?能简单说一下hive都支持哪些子查询吗?
12、sqoop使用过吗?说一下sqoop的工作原理,以及使用体验
13、group by的高级特性了解过吗?能简单说一下cube的使用吗?
14、在工作中使用过hive的权限吗?能简单说一下吗?
15、能说一下你们项目中hive的库表设计吗?
16、hive的窗口函数使用过吗?如果用过,能说一下使用窗口函数写过的业务需求吗?
17、你们的数据格式是什么样子的?json还是xml亦或者是文本格式?如果是json格式,你在
使用hive时,有指定存储格式为json吗?如果没有指定,那是如何做的数据清晰?
答:hive文件存储格式包括:
- Textfile ---->默认格式
- sequencefile --->hadoop API提供的一种二进制文件
- Rcfile --->行列存储相结合的一种存储格式
- orcfile(0.11以后出现) --->对orcfile的优化
注释:sequencefile、rcfile、orcfile、格式的表不能直接从本地文件导入数据,数据先导入到textfile格式的表中,然后再从表中用insert导入sequencefile、rcfile、orcfile
- 你认为数据仓库和数据库有什么区别?
答:数据库:在线交易数据
数据仓库:历史数据
- 数据库:数据库的建模遵循三范式;
数据仓库采用维度建模;
- 存储:数据仓库 存多种数据,数据量大,历史数据
数据库:存储在线交易数据
- 设计: 数据仓库:引入冗余,反范式方式设计,分析数据
数据库:尽量避免冗余符合范式规则, 捕获数据
- ×× 数据仓库:为分析分析数据而设计
数据库:为捕获数据而设计
19、hive和mysql这些传统型数据库有什么区别
答:1hive是建立在Hadoop之上,hive数据存储在hdfs中。数据库可以将数据保存在块设备或者本地文件系统中。
2数据格式:
3数据更新:hive :hive为数据仓库的应用设计,读多写少,hive中不支持对数据的改写和添加。
Mysql:数据库中通常需要经常进行修改,insert into ......values 添加数据 update set修改数据
4索引 :hive加载过程不会对数据进行任何处理;
Hive访问数据需要暴力扫描整个数据,--->访问延时率高;
Mysl少量特定数据访问,效率高,较低延时。
5执行引擎:hive查询,是hadoop mapreduce来实现;
数据库有自己的执行引擎
6数据规模:
Hive表的知识
个人职责: 体现自定义UDAF、UDF、窗口函数、聚合函数;体现hive的功能。
维度表:时间维度;地区维度;ODS表。
Hive职责 3-4种; 主要体现hive的功能