大数据开发——Hive笔记

写在前面

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。Hive的运行原理--实际上是mapreduce的客户端,最终转换为mapreduce程序放到yarn上面执行。

常见问题

1.什么是metastore.

metadata即元数据。包含database、tabel、column names、partitions信息、bucketing信息等的元数据信息。
元数据默认是存储在Derby中,建议存储在关系型数据库中。

2.metastore安装方式有什么区别.

  • 内嵌模式
    • 内嵌模式使用的是内嵌的Derby数据库来存储元数据,也不需要额外起Metastore服务。这个是默认的,配置简单,但是一次只能一个客户端连接,适用于用来实验,不适用于生产环境。
  • 本地元存储
    • 本地安装mysql 替代derby存储元数据, - 这种安装方式和嵌入式的区别在于,不再使用内嵌的Derby作为元数据的存储介质,而是使用其他数据库比如MySQL来存储元数据。 hive服务和metastore服务运行在同一个进程中,mysql是单独的进程,可以同一台机器,也可以在远程机器上。
  • 远程元存储(HiveServer2)
    • Hive服务和metastore在不同的进程内,可能是不同的机器,该模式需要将hive.metastore.uris设置为metastore服务器URL,如果有多个metastore服务器,将URL之间用逗号分隔,metastore服务器URL的格式为thrift://127.0.0.1:9083。

3.什么是Managed Table跟External Table.

  1. Hive有两种类型的表Managed Table跟External Table
  2. Managed Table:也被称作Internal table,这种表是hive的默认类型. 如果你在创建表的时候没有指明Managed或者External,那么默认就会给你创建Managed Table.
    • Managed Table的数据,会存放在HDFS中的特定的位置中,通常是/user/username/hive/warehouse.
    • 我们可以使用describe formatted table_name命令来查看表的信息.
    • 当你删除drop table table_name;删除表时,数据文件也会一并删除.
![describe formatted table_name](https://raw.githubusercontent.com/hulichao/myblog_pic/master/blog/formatted_table.png)
3. External Table: 特别适用于想要在Hive之外使用表的数据的情况.当你删除External Table时,只是删除了表的元数据,它的数据并没有被删除.

4.什么时候使用Managed Table跟External Table.

  • Managed Table:
    • 适用于临时创建的中间表.
  • External Table
    • 适用于数据多部门共享.

5.hive有哪些复合数据类型.

  1. MAP
  • Map复合数据类型提供了key-value对存储.你可以通过key获取value.
  • zhangsan Math:90,Chinese:92,English:78
    • create table score_map(name string,score map<string,int>) map keys terminated by ':';
    • select name,score['English'],size(score) from score_map;
  1. STRUCT
  • Struct是不同数据类型元素的集合。
  • zhangsan Math,90
    • create table course_struct(name string,course struct<course:string,score:int>) collection items terminated by ',';
    • select name,course.score,course.course from course_struct;
  1. ARRAY
  • Array是同类型元素的集合.
  • zhangsan beijing,shanghai,Hangzhou
    • create table person_array(name string,work_locations array<string>) collection items terminated by ',';
    • select name,work_locations[0],size(work_locations) from person_array;
  1. UNIONTYPE
  • 它代表一个可以具有属于你所选择的任何数据类型的值的列。
  • 官方支持不完整,在join查询中,group by或者where字句会失败.目前可以不用这个集合.
![UNIONTYPE](https://raw.githubusercontent.com/hulichao/myblog_pic/master/blog/hive_uniontype.png)

6.hive 分区有什么好处.

  • 最大的好处就是可以更快的执行查询.
  • 在分区的帮助下,将使用分区列的名称创建一个子目录,并且当使用WHERE子句执行查询时,将只扫描特定的子目录,而不是扫描整个表。 这使可以更快地执行查询。

7.hive 分区跟分桶的区别.

  • 分区: 是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在, 但是该字段不存放实际的数据内容,仅仅是分区的表示(伪列)。
  • 分桶:对于表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。实际使用比较少。

8.hive如何动态分区.

  • 与分区有关的有两种类型的分区静态和动态。 在静态分区中,您将在加载数据时(显式)指定分区列。
  • 而在动态分区中,您将数据推送到Hive,然后Hive决定哪个值应进入哪个分区。 要启用动态分区,请设置下面的属性: 设置hive.exec.dynamic.parition.mode = nonstrict;
  • insert overwrite table emp_details_partitioned partition(location) select * from emp_details;

9.map join优化手段

  • Hive可以进行多表Join。Join操作尤其是Join大表的时候代价是非常大的.
  • 表Join的顺序(大表放在后面)
    • 当Hive执行Join时,需要选择哪个表被流式传输(stream),哪个表被缓存(cache)。 Hive将JOIN语句中的最后一个表用于流式传输,因此我们需要确保这个流表在两者之间是最大的。
    • 如果要在不同的key上join更多的表,那么对于每个join集,只需在ON条件右侧指定较大的表。
  • Sort-Merge-Bucket (SMB) Map Join
    • 它是另一种Hivejoin优化技术,使用这个技术的前提是所有的表都必须是桶分区(bucket)和排序了的(sort)。
    • set hive.enforce.sortmergebucketmapjoin=false; -- 当用户执行bucketmapjoin的时候,发现不能执行时,禁止查询是被.
    • set hive.auto.convert.sortmerge.join=true; -- 如果join的表通过sort-merge join的条件,join是否会自动转换为sort-merge join。
    • set hive.optimize.bucketmapjoin = true; -- bucketmapjoin优化
    • set hive.optimize.bucketmapjoin.sortedmerge = true; -- bucketmapjoin优化
    • set hive.auto.convert.join=false; -- 禁止自动Map-Side Join发生

10.如何创建bucket表

  • 默认情况下,在Hive中禁用分桶功能,可以通过设置下面的属性强制启用分桶功能: 设置hive.enforce.bucketing = true;

11.hive有哪些file formats

  • Text File format:默认格式. 数据不做压缩,磁盘开销大,数据解析开销大。
  • Sequence File format:
    • SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。
    • SequenceFile支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩。
  • RC file format: RCFILE是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。RCFile目前没有性能优势, 只有存储上能省10%的空间.
  • Parquet:列式数据存储.
  • AVRO:avro Schema数据序列化.
  • ORC: 对RCFile做了一些优化, 支持各种复杂的数据类型.

12.hive最优的file formats是什么?

  • ORC file formats:
    • ORC将行的集合存储在一个文件中,并且集合内的行数据将以列式存储。 采用列式格式,压缩非常容易,从而降低了大量的存储成本。
    • 当查询时,会查询特定列而不是查询整行,因为记录是以列式存储的
    • ORC会基于列创建索引,当查询的时候会很快.

13.hive 传参

  • 使用env获取当前shell环境的环境变量
    • eg: export datatime=’2017-11-10’
    • select * from tabliname where datatime = ${env:datatime};
  • 使用--hivevar方式传入
    • hive --hivevar datatime =’ datatime’ --hivevar limit=10 -f filename.sql
    • select * from tablename where datatime = ${hivevar:datatime} limit ${hivevar:limit}

14. Order by和Sort by的区别

  • 使用order by会引发全局排序,有可能会导致任务失败.
  • 使用distribute by + sort by替代方案,进行优化.

15. hive跟hbase的区别

  • hive支持sql查询,hbase不支持
  • hive不支持record级(一行记录)的更新,删除操作
  • hive定义为数据仓库,hbase定义为nosql数据库.

16.Hive数据仓库与数据库的异同

(1)由于Hive采用了SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,
再无类似之处。
(2)数据存储位置。 hdfs raw local fs
(3)数据格式。 分隔符
(4)数据更新。hive读多写少。Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。
INSERT INTO … VALUES添加数据,使用UPDATE … SET修改数据 不支持的
HDFS 一次写入多次读取
(5) 执行。hive通过MapReduce来实现的 而数据库通常有自己的执行引擎。
(6)执行延迟。由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致Hive执行延迟高的因素是MapReduce框架
(7)可扩展性
(8)数据规模。

参考

posted @ 2019-03-12 15:52  Hoult丶吴邪  阅读(265)  评论(0编辑  收藏  举报