hive之细碎篇

    技术2024-07-22  70

    1、strict严格模式

    Hive配置中有个参数hive.mapred.mode,分为nonstrict,strict,默认是nonstrict 如果该模式值为strict,将会阻止以下三种查询: (1)、对分区表查询,where中过滤字段不是分区字段。 (2)、笛卡尔积join查询,join查询语句,不带on条件或者where条件。 (3)、对order by查询,有order by的查询不带limit语句 一般来说,查询分区表时,一定会在where子句中加上分区条件,指明查看哪个分区的数据。否则会报错。因为默认set hive.mapred.mode=strict.即严格模式。 如果set hive.mapred.mode=nostrict.可以查询分区表时不带分区声明,这个时候会返回整张表的所有数据,即整张表各个分区的数据都会显示出来。这种实际很少使用,因为效率低。

    2、动态分区参数设置

    http://lxw1234.com/archives/2015/06/286.htm

    hive.exec.dynamic.partition=True hive.exec.dynamic.partition.mode=nonstrict #分区向表插入数据 hive.exec.max.dynamic.partitions.pernode 每个节点创建分区个数 hive.exec.max.dynamic.partitions 所有节点创建分区个数 hive.exec.max.created.files 创建文件 hive.error.on.empty.partition 空分区异常 -- Hive默认配置值 -- 开启或关闭动态分区 hive.exec.dynamic.partition=false; -- 设置为nonstrict模式,让所有分区都动态配置,否则至少需要指定一个分区值 hive.exec.dynamic.partition.mode=strict; -- 能被mapper或reducer创建的最大动态分区数,超出而报错 hive.exec.max.dynamic.partitions.pernode=100; -- 一条带有动态分区SQL语句所能创建的最大动态分区总数,超过则报错 hive.exec.max.dynamic.partitions=1000; -- 全局能被创建文件数目的最大值,通过Hadoop计数器跟踪,若超过则报错 hive.exec.max.created.files=100000;

    3、hive中set等控制map和reduce数量

    控制map和reduce的参数

    set mapred.max.split.size=256000000; – 决定每个map处理的最大的文件大小,单位为B set mapred.min.split.size.per.node=1; – 节点中可以处理的最小的文件大小 set mapred.min.split.size.per.rack=1; – 机架中可以处理的最小的文件大小 方法1 set mapred.reduce.tasks=10; – 设置reduce的数量 方法2 set hive.exec.reducers.bytes.per.reducer=1073741824 – 每个reduce处理的数据量,默认1GB

    控制参数:https://blog.csdn.net/zhong_han_jun/article/details/50814246

    4、负载均衡hive.groupby.skewindata

    在多个列上进行的去重操作与hive环境变量hive.groupby.skewindata存在关系。 当hive.groupby.skewindata=true时,hive不支持多列上的去重操作

    • hive.map.aggr = true 是否在 Map 端进行聚合,默认为True • hive.groupby.mapaggr.checkinterval =100000 在 Map 端进行聚合操作的条目数目 • 有数据倾斜的时候进行负载均衡 • hive.groupby.skewindata = false 默认 • 当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group ByKey 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce中),最后完成最终的聚合操作。 hive.groupby.skewindata变量:用于控制负载均衡的。当数据出现倾斜时,如果该变量设置为true,那么Hive会自动进行负载均衡。

    5、Hive 执行过程概述

    hql的mapreduce过程

    https://www.cnblogs.com/qingyunzong/p/8847651.html

    Hive特点

    (1) Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后在Hadoop平台上运行,达到快速开发的目的。

    (2) Hive本质是将HQL转化成Mapreduce程序

    (3) Hive中的表是纯逻辑表,只有表的定义等,即表的元数据。本质就是Hadoop的目录/文件,达到了元数据与数据存储分离的目的.

    (4) Hive本身不存储数据,它完全依赖HDFS和MapReduce。

    (5) Hive的内容是读多写少,不支持对数据的改写和删除。

    (6) Hive中没有定义专门的数据格式,由用户指定,需要指定三个属性:

    - 行分隔符:空格、\t、\001

    - 列分隔符:\n

    - 文件格式:TextFile、SequenceFile、RCFile

    Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候确定好的,而数据库中的数据通常是需要修改的

    6、reduce

    1、order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)会导致当输入规模较大时,需要较长的计算时间。 与数据库中 order by 的区别在于在hive.mapred.mode = strict 模式下 必须指定 limit 否则执行会报错。 2、sort by只保证每个reducer的输出有序,不保证全局有序。

    可以指定执行的reduce 个数 (set mapred.reduce.tasks=) 这样可以输出更多的数据。

    对输出的数据再执行归并排序,即可以得到全部结果。

    3、 distribute by

    按照指定的字段对数据进行划分到不同的输出reduce / 文件中。根据name的长度划分到不同的reduce中,最终输出到不同的文件中

    insert overwrite local directory ‘/home/hadoop/out’ select * from test order by name distribute by length(name);

    4、 Cluster By

    cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。倒序排序,且不能指定排序规则。 asc 或者 desc

    7、优缺点

    优点:   1、可扩展性,横向扩展,Hive 可以自由的扩展集群的规模,一般情况下不需要重启服务 横向扩展:通过分担压力的方式扩展集群的规模 纵向扩展:一台服务器cpu i7-6700k 4核心8线程,8核心16线程,内存64G => 128G   2、延展性,Hive 支持自定义函数,用户可以根据自己的需求来实现自己的函数   3、良好的容错性,可以保障即使有节点出现问题,SQL 语句仍可完成执行 缺点:   1、Hive 不支持记录级别的增删改操作,但是用户可以通过查询生成新表或者将查询结 果导入到文件中(当前选择的 hive-2.3.2 的版本支持记录级别的插入操作)   2、Hive 的查询延时很严重,因为 MapReduce Job 的启动过程消耗很长时间,所以不能 用在交互查询系统中。   3、Hive 不支持事务(因为不没有增删改,所以主要用来做 OLAP(联机分析处理),而 不是 OLTP(联机事务处理),这就是数据处理的两大级别)

    8、数据特点和使用

    分区的Hive表,每个分区下都是很多个小文件而不是大文件*。所以选取小时下的所有文件还要 day/hour/*

    需要注意having和where的用法区别: 1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。 2.where肯定在group by 之前,即也在having之前。 3.where后的条件表达式里不允许使用聚合函数(count(),sum(),avg(),max(),min()),而having可以。 四、当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是: 1.执行where --group by---having --order by

    9、注释+数据类型

    单行注释:-- 多行注释:/*......*/ 2、real数据类型 real型数据的存储大小为4个字节,可精确到小数点后第7位数字。 这种数据类型的数据存储范围为从-3.40E+38~-1.18E-38,0和1.18E-38~3.40E+38。 在MSSQL中real的同义词是float,用法几乎一样 3、float数据类型 float型的数据存储大小为8个字节,可精确到小数点后15位数字。
    Processed: 0.012, SQL: 10