zoukankan      html  css  js  c++  java
  • 大数据开发——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)数据规模。

    参考

  • 相关阅读:
    virtualenv与virtualenvwrapper
    数据类型、变量定义、数据类型转换
    计算机存储单元、标识符
    html单页面中用angular js
    svn客户端访问失败,错误“请求的名称有效,但是找不到请求的类型”的解决
    php 获取某数组中出现次数最多的值(重复最多的值)与出现的次数
    数据库导入时出现“2006
    phpstorm 激活
    取消本地SVN文件夹与服务器的关联
    js实现倒计时函数
  • 原文地址:https://www.cnblogs.com/hulichao/p/bigdata_hive.html
Copyright © 2011-2022 走看看