Hive动态分区

1、首先创建一个分区表
create table t10(name string)
partitioned by(dt string,value string)
row format delimited fields terminated
by '\t' lines terminated by '\n'
stored as textfile;
2、然后对hive进行设置,使之支持动态分区,
set hive.exec.dynamic.partition.mode=nonstrict;
如果限制是strict,则必须有一个静态分区,且放在最前面
set hive.exec.dynamic.partition.mode=strict;
3、最后向t10表中插入数据,同时指定分区
insert overwrite table t10 partition(dt='2014010090',value)
select '34' as name,addr as value from t9;
HQL函数
1、order by
    按照某些字段进行排序,例如:select clol,clo2... from table_name where condition order by clo1,clo2[asc|desc];order by 后面可以对多列进行排序,默认按照字典进行排序,order by为全局排序,它需要reduce操作,并且只有一个reduce,和配置没有关系
假如表t2中的数据格式为:

id     name
1    zhangsan
2      lisi
3     wangwu
4     sunfei
5     cuiying
对此进行语句:select * from t2 order by id desc,name asc;
对第一列进行降序排列,对第二列进行升序排列。由于order by是全局排序,并且只使用了一个reduce,所以在实际应用中应该尽量少使用order by进行排序


2、group by
    按照某些字段的值进行分组,将相同的值放在一起
select col1[,col2],count(),sel_expr(聚合操作)
from table
where condition
group by col1[,col2]
[having]
注意,select后面非聚合列必须出现在group by中,除了普通列就是一些聚合操作,group by后面也可以跟表达式,比如substr(col)
同时,group by 使用了reduce操作,受限于reduce的数量,设置reduce的数量可以mapred.reduce.tasks,输出文件个数和reduce的个数
相同,文件大小与reduce处理的数据量有关,在实际应用过程中,它存在一些问题,如网络负载过重以及数据倾斜(在处理数据过程中,从map到reduce的过程是按照key值进行划分,
由key值决定文件是由哪个reduce来执行,假如某一个reduce中处理的key过多,即就是某一个reduce处理任务过多,执行时间过长,导致整个Job作业执行时间过长,在其他reduce任务已经完成后,
这个处理过多reduce的任务会严重拖慢整体任务的完成时间,这就是数据倾斜,可以通过将
hive.groupby.skewindata参数设置为true,hive自动启动优化程序来避免数据倾斜)等问题。
例如:set mapred.reduce.tasks=5;
      set hive.groupby.skewindata=true;//数据倾斜时候可以使用
      select country,count(1) as num from info group by country;


3、join
两个表m,n之间按照On条件进行连接,m中的一条记录和n中的一条记录组成一条新纪录,它是等值连接,只有某个值在m和n中同时存在的时候才可以进行连接操作,left outer join 左边外接,左边
表中的值无论是否在b中存在的时候,都输出,右边表中的值只有在左边表中存在的时候才输出,left outer join则相反,left semi join的作用类似于exits, mapjoin则是在map端完成join操作,
不需要reduce,基于内存做join,属于优化操作
例如:
a表:     b表:
co1 co2   co3   co4
1    w     1     f
3    e     1     g
5    r     4     j
对a和b表执行语句:
select s.co1,s.co2,t.co4
from
(select col from a where ...(map端执行))s(左表)
join
(select col from b)t(右表)
on s.co1 = t.co3
where condition(reduce端执行)
其结果为:
1 w f
1 w g
5 e j
执行过程是:对于a表中的每一行数据,在b表中进行遍历,如果查找到相同的则提取这一样存在一个新表中。
如果将join修改为:left outer join 则执行结果为:
1 w f
1 w g
5 e j
3 r null
执行原则是:key值必须在a表中存在,但可以不在b表中存在
如果将join修改为:right outer join 则执行结果为:
1 w f
1 w g
5 e j
2 null p
执行原则是:key值必须在b表中存在,但可以不在a表中存在
如果将join修改为:left semi join 则执行结果为:
1 w f
5 e j
执行原则是:首先查看a表中的第一条记录,如果在b中存在相同记录则输出a中的记录


4、Mapjoin
    Mapjoin在map端把小表加载到内存中,然后读取大表,和内存中的小表完成连接操作,
其中使用了分布缓存技术,它的执行不消耗集群的reduce资源(因为集群的reduce
资源相对短缺),减少了reduce操作,加快程序执行,降低网络负载,但是,它占用
部分内存,所以加载到内存中的表不能过大,因为每个计算节点都会加载一次,同时
会生成较多的小文件。
    通过如下配置,hive自动根据sql选择使用common join或者map join
    set hive.auto.convert.join=true;
    hive.mapjoin.smalltable.filesize默认值为25Mb
还可以手动指定:
    select/*+mapjoin(n(表名))*/m.col,m.col2,n.col3 from m
    join n
    on m.col = n.col
总之,mapjoin的使用场景主要有:
    关联操作中有一张表非常小,大表和小表进行关联
    不等值的链接操作


5、Hive分桶
    (1)对于每一个表或者分区,Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据
    范围划分
    (2)Hive是针对某一列进行分桶
    (3)Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶中
    分桶的好处是可以获得更高的查询处理效率,使取样更高效
    create table t(id int,name string)
    clustered by(id)sorted by(name)into 4 buckets
    row format delimited fields terminated by '\t'
    stored as textfile;
    set hive.enforce.bucketing=true;
6、分桶的使用
    select * from t tablesample(bucket 1 out of 2 on id)
    这句话的意思是将所有的桶分成两份,然后取其中的一份
    bucket join
    set hive.optimize.bucketmapjoin = true;
    set hive.optimize.bucketmapjoin.sortedmerge =true;
    set hive.input.format = org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
    连接两个在(包含连接列)相同列张划分了桶的表,可以使用Map端连接(Map-site join)
    高效的实现,比如Join操作。对于Join操作两个表有一个相同的列,如果对这两个表都进
    桶操作,那么将保存相同列值得桶进行Join操作就可以,可以大大减少Join的数据量
    对于Mapd端连接的情况,两个表以相同方式划分桶。处理左边表某个桶的mapper知道右边表
    内相匹配的行在对应的桶内。因此,mapper只需要获取那个桶(这只是右边表内存储数据的
    一小部分)即可进行连接。这一优化方法并不一定要求两个表的桶的个数相同,两个表的桶
    个数是倍数关系也可以。

Hive学习之动态分区及HQL的更多相关文章

  1. sqoop导oracle数据到hive中并动态分区

    静态分区: 在hive中创建表可以使用hql脚本: test.hql USE TEST; CREATE TABLE page_view(viewTime INT, userid BIGINT, pag ...

  2. hive:默认允许动态分区个数为100,超出抛出异常:

    在创建好一个分区表后,执行动态分区插入数据,抛出了错误: Caused by: org.apache.hadoop.hive.ql.metadata.HiveFatalException: [Erro ...

  3. 【Hive学习之五】Hive 参数&动态分区&分桶

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...

  4. hive动态分区和混合分区

    各位看官,今天我们来讨论下再Hive中的动态分区和混合分区方面的一些知识点以及相关的一些问题. 前面我们已经讲过管理表和外部表的一般分区的一些知识点,对于需要对表创建很多的分区,那么用户就需要些很多的 ...

  5. hive SQL 静态分区和 动态分区

    Hive 分区介绍: hive中简单介绍分区表(partition table),含动态分区(dynamic partition)与静态分区(static partition) hive中创建分区表没 ...

  6. hive 动态分区实现 (hive-1.1.0)

    笔者使用的hive版本是hive-1.1.0 hive-1.1.0动态分区的默认实现是只有map没有reduce,通过执行计划就可以看出来.(执行计划如下) insert overwrite tabl ...

  7. Hive动态分区详解

    目录 动态分区调整 注意 动态分区插入 动静分区结合 例子 动态分区调整 动态分区属性:设置为true表示开启动态分区功能(默认为false)hive.exec.dynamic.partition=t ...

  8. Hive 学习之路(五)—— Hive 分区表和分桶表

    一.分区表 1.1 概念 Hive中的表对应为HDFS上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为HDFS上表目录的子目录,数据按照分区存储在子目录中.如 ...

  9. hive学习(六) 参数和动态分区

    1.hive 参数.变量 1.1hive的命名空间: hive当中的参数.变量,都是以命名空间开头  

随机推荐

  1. vmware虚拟机迁移导致的eth0消失问题

    将原来的ubuntu虚拟机文件迁移到还有一台机子之后. ifconfig显示仅仅有一个lo网卡,网上找了一些文章.大多是改动/etc/network/interfaces 原来内容是 # ###### ...

  2. 佩特来项目经验小集合(2)___组合查询存储过程,报错 "varchar JBID='' 转换成数据类型 int 时失败"

       今天写一个组合查询的存储过程遇到这样一个问题:在将 varchar 值 'SELECT * FROM View_DLS_WXJD_Customer WHERE 1=1 and JBID ='' ...

  3. 3种SQL语句分页写法

    在开发中经常会使用到数据分页查询,一般的分页可以直接用SQL语句分页,当然也可以把分页写在存储过程里,下面是三种比较常用的SQL语句分页方法,下面以每页5条数据,查询第3页为例子: 第一种:使用not ...

  4. SQL初级阶段笔记

    DataBase Management Stystem(数据库管理系统)简称:DBSM:虽然DBSM并不等于数据库,但行业内通常将DBSM称为数据库,所以一般来说数据库就指的是DBSM. 简单来讲DB ...

  5. oracle日期函数集锦

    oracle 中select TO_CHAR(sysdate,'Mon') from dual; Question:出来是中文的“6月” 我想要英文的怎么办? Answer:select to_cha ...

  6. BST的删除

    #include<iostream> #include<math.h> #include<stdio.h> #include<stdlib.h> #in ...

  7. return break continue 的区别

    1)break     直接跳出当前的循环,从当前循环外面开始执行,忽略循环体中任何其他语句和循环条件测试.他只能跳出一层循环,如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用break来 ...

  8. CentOS 配置防火墙操作实例(启、停、开、闭端口)CentOS Linux-FTP/对外开放端口(接口)TomCat相关

    链接地址:http://blog.csdn.net/jemlee2002/article/details/7042991 CentOS 配置防火墙操作实例(启.停.开.闭端口): 注:防火墙的基本操作 ...

  9. Java提高学习之Object类详解(1)

    转自:http://www.importnew.com/10304.html 问:什么是Object类? 答:Object类存储在java.lang包中,是所有java类(Object类除外)的终极父 ...

  10. RabbitMQ 消息队列

    一:简介 RabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务 ...