zoukankan      html  css  js  c++  java
  • Hive中Bucket的应用

      网友南京-李先森给了他收集的一些资料,如下:

      Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了并行,每一个 Bucket 对应一个文件。如将 user 列分散至 32 个 bucket,首先对 user 列的值计算 hash,对应 hash 值为 0 的 HDFS 目录为:/ warehouse /xiaojun/dt =20100801/ctry=US/part-00000;hash 值为 20 的 HDFS 目录为:/ warehouse /xiaojun/dt =20100801/ctry=US/part-00020 

      这段描述是说用了bucket之后的,那为什么要用bucket,没说,本着认真负责的态度,我从网上搜索到了Oreilly《Programming.Hive》这本书,然后在里面找到了答案,现在发出来和大家分享一下。

      首先回顾一下分区,分区是切分数据的一种比较方便的方法,比较常用的就是按照日期来进行切分,bucket(中文意思就是篮子,可以放鸡蛋,哈哈)其实也是一种切分数据的方法。

      假设我们有一张日志表,我们需要按照日期和用户id来分区,目的是为了加快查询谁哪天干了什么,如下:

     CREATE TABLE weblog (url STRING, source_ip STRING)
    > PARTITIONED BY (dt STRING, user_id INT);

      但是这里面用user_id去切分的话,就会产生很多很多的分区了,这些分区可大可小,这个数量是文件系统所不能承受的。

      在这种情况下,我们既想加快查询速度,又避免出现如此多的小分区,篮子(bucket)就出现了。

      具体的用法是:

      

    CREATE TABLE weblog (user_id INT, url STRING, source_ip STRING)
    > PARTITIONED BY (dt STRING)
    > CLUSTERED BY (user_id) INTO 96 BUCKETS;

      首先按照日期分区,分区结束之后再按照user_id把日志放在96个篮子,这样同一个用户的所有日志都会在同一个篮子里面,并且一个篮子里面有好多用户的日志。

      然后我们在插入数据的时候就要注意了,我们一定要设置hive.enforce.bucketing为true。

      

    hive> SET hive.enforce.bucketing = true;
    hive> FROM raw_logs > INSERT OVERWRITE TABLE weblog > PARTITION (dt='2009-02-25') > SELECT user_id, url, source_ip WHERE dt='2009-02-25';

      

      

      到此,bucket介绍完毕!

    博文是转载的...

    岑玉海: http://www.cnblogs.com/cenyuhai/p/3323467.html

  • 相关阅读:
    [HNOI2002]营业额统计
    HDU 1374
    HDU 3345
    HDU 2089
    Graham扫描法
    Codeforces 1144D Deduction Queries 并查集
    Codeforces 916E Jamie and Tree 线段树
    Codeforces 1167F Scalar Queries 树状数组
    Codeforces 1167E Range Deleting
    Codeforces 749E Inversions After Shuffle 树状数组 + 数学期望
  • 原文地址:https://www.cnblogs.com/juefan/p/3414476.html
Copyright © 2011-2022 走看看