Hive的FAQ

版权声明:打个招呼,转载呗! https://blog.csdn.net/weixin_41919236/article/details/83996129

FAQ

  1. 你在工作中使用hive比较多,那么能不能简单介绍一下hive?

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。

Hive存放的是:表(数据+元数据)存的是hdfs的映射关系;hive是逻辑上的数据仓库,实际操作的都是hdfs上的文件。Hql就是用sql语法来写的mapreduce程序。

 

  1. 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语句本身有数据倾斜

  1. 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的话),也就是说外部表中的数据并不是由它自己来管理的!而内部表则不一样;

  1. 在删除内部表的时候,Hive将会把属于表的元数据和数据全部删除掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的!
  2. 在创建内部表或外部表时加上location的效果是一样的,只不过表目录的位置不同而已,加上partition用法也一样,只不过表目录下会有分区目录而已,load data local inpath 直接把本地文件系统的数据上传到hdfs上,有location上传到location指定的位置上,没有的话上传到hive默认配置的数据仓库中。
  3. 外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据

问:在创建表的时候,怎么指定分区?能不能简单说一下分区?

一、为什么要创建分区表


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';

  1. join优化做过吗?有哪些优化点?

答:hive的join有leftjoin、rightjoin、fulljoin等

 表连接优化 (join)

 

1.  将大表放后头

 

Hive假定查询中最后的一个表是大表。它会将其它表缓存起来,然后扫描最后那个表。

 

因此通常需要将小表放前面,或者标记哪张表是大表:/*streamtable(table_name) */

 

2. 使用相同的连接键

 

当对3个或者更多个表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。

 

3. 尽量尽早地过滤数据

 

减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段。

 

4. 尽量原子化操作

 

尽量避免一个SQL包含复杂逻辑,可以使用中间表来完成复杂的逻辑

  1. 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文件存储格式包括:

  1. Textfile ---->默认格式
  2. sequencefile --->hadoop API提供的一种二进制文件
  3. Rcfile --->行列存储相结合的一种存储格式
  4. orcfile(0.11以后出现) --->对orcfile的优化

注释:sequencefile、rcfile、orcfile、格式的表不能直接从本地文件导入数据,数据先导入到textfile格式的表中,然后再从表中用insert导入sequencefile、rcfile、orcfile

 

  1. 你认为数据仓库和数据库有什么区别?

答:数据库:在线交易数据

数据仓库:历史数据

  1. 数据库:数据库的建模遵循三范式;

  数据仓库采用维度建模;

  1. 存储:数据仓库 存多种数据,数据量大,历史数据

        数据库:存储在线交易数据

  1. 设计: 数据仓库:引入冗余,反范式方式设计,分析数据

         数据库:尽量避免冗余符合范式规则, 捕获数据

  1. ××    数据仓库:为分析分析数据而设计

         数据库:为捕获数据而设计

 

 

 

 

 

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的功能

 

猜你喜欢

转载自blog.csdn.net/weixin_41919236/article/details/83996129
FAQ
今日推荐