美文网首页
《Hive编程指南》读书笔记

《Hive编程指南》读书笔记

作者: kaiker | 来源:发表于2019-06-12 21:45 被阅读0次

    第一章 基础知识

    1.1 MapReduce和Hadoop基础

    Hive不支持记录级别的更新、插入或者删除、Hive不支持事务,Hive中的锁意义也不大。
    MapReduce-Map将输入的key-value转换为0至多个key-value-Reduce会将同个key的所有key-value进行处理,转换为一个key-value

    1.2 Hadoop生态中的Hive

    Hive通过一个表示“job执行计划”的XML文件驱动执行内置的、原生的Mapper和Reducer模块。
    如果用户需要使用Hive无法提供的数据库特性,可以尝试使用HBase。
    Pig 声明关系间联系,流式,常用于ETL。

    第二章 基础操作

    2.7 命令行界面

    通过set hivevar:变量名 设置自定义变量。在Aeolus可通过{{变量名}}设置自定义变量

    第三章 数据类型和文件格式

    3.1 基本数据类型

    用户将float与double进行对比时,hive会隐式地将类型转换为两个类型中值较大的一类。

    3.2 集合数据类型

    Hive中包括struct、map和array集合数据类型。
    struct类似C里的struct,调用时使用字段名.xxx调用
    map是key-value形式,调用时使用字段名['xxx']调用
    array是数组形式,调用时用字段名[1]调用

    3.3 文本文件数据编码

    hive中默认的记录和字段分割符:\n换行,^A用于分割列,^B用于分割array或者struct,^C用于分割键和值

    3.4 读时模式

    传统数据库是写时模式,在写入时进行数据检查
    Hive是读时模式,在查询时进行数据验证

    第四章 HiveQL:数据定义

    4.1 Hive中的数据库

    hive中可以重复使用use,因为hive没有嵌套数据库概念

    在drop后添加cascade可先自行删表

    4.3 创建表

    hive会自动增加两个属性:last_modified_by和last_modified_time
    hive可创建外部表,外部表可以是存储在其他位置的文件

    4.4 分区表

    分区表在底层的实现上是将每个分区设置为独立的文件,以分区命名。
    在Aeolus查询需要指定分区,提高查询效率。

    第五章 HiveQL:数据操作

    5.1 向管理表中装载数据

    Hive没有行级别的数据插入、数据更新和删除操作,所以更新是批量处理的。
    insert overwrite table xxx partition(xxx)
    指定了overwrite之后目标文件中之前存在的数据将会被先删除掉
    hive可动态插入分区,根据select最后n个字段(对应n个分区)进行插入

    第六章 HiveQL:查询

    6.1 select语句

    explode(xxx)可用于打散array,map。配合lateral view使用,可以让打散后的值变为多行
    本地模式下hive可避免mapreduce,进行全表扫描、仅限制分区的查询时会是本地模式

    6.2 where语句

    Rlike实现正则匹配
    浮点数比较,显示指出浮点数类型

    6.4 JOIN语句

    hive只支持等值连接,因为其他类型可能较难在MapReduce中实现
    hive假定查询中最后一个表是最大的那个表,从左到右表的大小依次增加
    left semi join用来替代 in接子查询
    笛卡尔积不是并行执行的,在Mapreduce中无法进行优化
    map-side join解决数据倾斜

    6.5 order by/sort by/distribute by/cluster by

    sort by只会在每个reducer里面进行排序
    结合distribute by使用,可以使相同的key在一起进行排序,在有组内排序需求时可以使用
    cluster by = sort by + distribute by

    6.6 类型转换

    cast(字段 as 类型),在进行比较时,建议转换为同一类型后比较

    6.7 抽样查询

    https://blog.csdn.net/zylove2010/article/details/78290319
    如果有用到,可能大多是使用的上述第三种 order 关键词
    select * from table_name where col=xxx order by rand() limit num;

    第七章 HiveQL:视图

    视图在工作中较少用,Hive并不支持通过视图实现访问安全,因为用户必须有能够访问整个底层原始表的权限,这样视图才能工作

    第八章 HiveQL:索引

    bitmap索引:
    https://blog.csdn.net/zhou920786312/article/details/72790171
    http://blog.itpub.net/29654823/viewspace-2150299
    列较多、列基数较小的情况下适用,占用空间小,and运算适用。

    第九章 模式设计

    分区是hive的重要特点,分区大大减少hive的数据扫描。
    对于太零散的分区,可以使用分桶的方式,将数据打散进行存储。具体的实现方式样例:clustered by (字段名) into 96 buckets
    列存储运用:列当中存在较多重复值、列数特别多。

    https://www.cnblogs.com/ljhdo/archive/2017/12/14/5508274.html
    行存储使用逐行处理模式,每次只处理一行数据;而列存储索引使用批处理模式,每次处理一批数据行。
    行存储是逐行存储(Row Store),每一个Page存储多行数据,而列存储(Column Store)把数据表中的每一列单独存储在Page集合中,这意味着,Page集合中存储的是某一列的数据,而不是一行中所有列的数据。在读取数据时,行存储把一行的所有列都加载到内存,即使有些列根本不会用到;而列存储只把需要的列加载到内存中,不需要的列不会被加载到内存中。
    列存储索引自动对数据进行压缩处理,由于同一行的数据具有很高的相似性,压缩率很高,数据读取更快速。

    多运用压缩,因为hive对压缩非常兼容,而MapReduce任务大多是IO密集,而不是CPU密集。

    第十章 调优

    10.1 explain

    对于explain的输出可以忽略TOK_
    每个stage可以是一个MapReduce任务、抽样阶段、合并阶段、limit阶段
    Mysql执行顺序:https://www.cnblogs.com/rollenholt/p/3776923.html
    Hive执行顺序:https://www.cnblogs.com/gxgd/p/9431783.html select的位置不同主要与hive map reduce的过程有关。

    10.2 限制调整

    hive.limit.optimize.enable 限制limit的数量

    10.3 本地模式

    hive可通过本地模式在单台机器上处理所有任务,数据量小的时候可以使用

    10.4 严格模式

    限制三类情况:一、必须限制分区;二、order by必须limit;三、限制笛卡尔积查询

    10.5 调整mapper和reducer数量

    https://blog.csdn.net/B11050101/article/details/78754652
    map的块默认大小128MB
    reduce块默认大小1GB
    只有一个reducer:没有group by;用了order by;使用了笛卡尔积

    10.6 动态分区调整

    (1) 尽量不要用动态分区,因为动态分区的时候,将会为每一个分区分配reducer数量,当分区数量多的时候,reducer数量将会增加,对服务器是一种灾难。
    (2) 动态分区和静态分区的区别,静态分区不管有没有数据都将会创建该分区,动态分区是有结果集将创建,否则不创建。
    (3) hive动态分区的严格模式和hive提供的hive.mapred.mode的严格模式。

    10.7 推测执行

    触发执行一些重复的任务,通过加快获取单个任务的结果以及进行侦测将执行慢的tasktracker加入到黑名单的方式来提高整体任务的执行效率

    10.8 单个MR中多个Group by

    hive.multigroupby.signlemr
    将多个group by组装到单个MR中

    第十一章 其他文件格式和压缩方法

    Hive利用Hadoop的InputFormat API来从不同的数据源读取数据
    减小磁盘和网络的I/O操作,压缩、解压缩过程增加CPU开销
    sequence file存储格式可以将一个文件划分成多个块,然后才用一种可分割的方式对块进行压缩

    第十三章 函数

    explode() array作为输入,会将array拆分为列
    lateral vuew使其他字段也编程多列,配合explode(),如果array里是空,那打散后,该行不会被显示。

    第十四章 Streming

    streming提供了另一种处理数据的方式。在streming job中,Hadoop streming API会为外部进程开启一个I/O管道。
    streming引入python处理,
    select transform(line) using 'xxx.py' as col1,col2 from table

    第十五章 自定义Hive文件和记录格式

    15.1 文件格式

    SequenceFile文件是含有key-value的二进制文件,是压缩、存储空间小的格式
    RCfile https://www.cnblogs.com/bigdatafly/articles/5037794.html 行列混合

    15.2 记录格式

    SerDe是序列化/反序列化的简写形式。一个SerDe包含了将一条记录的非结构化字节转化成Hive可以使用的一条记录的过程。
    CSVSerDe就可以处理csv格式的文件。

    第十七章 存储处理程序和NoSQL

    InputFormat抽象接口类,可以将不同源的数据格式化成可以作为job输入的格式。
    OutputFormat抽象借口类,可以获得一个job输出,输出到一个实体中。
    InputFormat和OutputFormat抽象借口可被用于从其他数据源中读取和存放数据
    HDFS中典型的访问是完全顺序I/O

    第十九章 锁

    Hive CLI、Thrift server后者web接口实例都不是完全独立于其他实例的,因为这个独立性,所有锁必须由单独的系统进行协调。

    相关文章

      网友评论

          本文标题:《Hive编程指南》读书笔记

          本文链接:https://www.haomeiwen.com/subject/efpctctx.html