zoukankan      html  css  js  c++  java
  • Hive分桶bucket

    数据分桶的原理:

    按照分桶字段的hash值去模除以分桶的个数

    对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

    把表(或者分区)组织成桶(Bucket)有两个理由:
    1、提高join查询效率

      获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

    2、方便抽样

      使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

    创建数据分桶表

    create table emp_bucket (
    empno int, 
    ename string, 
    job string, 
    mgr int,
    hiredate string, 
    sal float, 
    comm float, 
    deptno int)
    clustered by (empno)  --按照empno分桶
    sorted  by (empno)   --按照empno排序
    into 4 buckets     --分成4个桶
    row format  delimited fields terminated by '	';  --每个字段以制表符分割
    lines terminated by ' ' stored as textfile; --可以省略不写,行分割和数据格式

    插入数据之前设置如下参数,以强制hive的reducer数目为分桶数。如果不设置这个hive参数,最后的桶个数可能不是建表语句中的个数。

     set hive.enforce.bucketing=true 

    将数据插入到分桶表

    不能采用load data [local] inpath '/home/emp.txt' into table emp_bucket这种写法,这种写法没有分桶,hive的目录下只有一个txt物理数据。

    正确插入数据的方法是:

    从hdfs或本地磁盘中load数据,导入中间表,然后通过从中间表查询的方式的完成数据导入。

    假设现在已经有了中间表emp,通过查询emp表导入数据到分桶表

    insert [overwrite] into table emp_bucket select  * from db_hive.emp ;

    查看数据

    hive (db_hive)> dfs -cat /user/hive/warehouse/db_hive.db/emp_bucket/

     

    抽样查询

    tablesample是抽样语句,语法是tablesample(bucket x out of y)

    y必须是table总bucket(这个是4)的倍数或者因子,hive根据y的大小,决定抽样的比例,

    如table总共分了4个bucket,当y=4时,4/4=1表示抽一个bucket的数据量,x表示从第几个bucket开始抽。

    select * from db_hive.emp_bucket tablesample(bucket 1 out of 4 on empno )

  • 相关阅读:
    TCP/IP四层模型
    Java中equals和==的区别
    最全前端资源汇集
    (转)php面向对象学习笔记
    学习内容
    Gulp入门教程
    seajs的CMD模式的优势以及使用
    正则
    Grunt
    Javascript 异步加载详解
  • 原文地址:https://www.cnblogs.com/lucas-zhao/p/11900287.html
Copyright © 2011-2022 走看看