zoukankan      html  css  js  c++  java
  • hive 中分桶抽样查询的原理刨析

    先把大家都知道的分桶抽样查询 的语法以及用法po出

    select * from 分桶表 tablesample(bucket x out of y on 分桶字段);

    假设当前分桶表,一共分了z桶!

    x: 代表从当前的第几桶开始抽样

    0<x<=y

    y: z/y 代表一共抽多少桶!

    y必须是z的因子或倍数!

    怎么抽: 从第x桶开始抽,当y<=z每间隔y桶抽一桶,直到抽满 z/y桶

    举例1:

    select * from stu_buck2 tablesample(bucket 1 out of 2 on id);

    从第1桶开始抽,每间隔2桶抽一桶,一共抽2桶!

    桶号: x+y*(n-1) 抽0号桶和2号桶

    举例2:

    select * from stu_buck2 tablesample(bucket 1 out of 1 on id);

    从第1桶开始抽,每间隔1桶抽一桶,一共抽4桶!

    抽0,1,2,3号桶

    举例3:

    select * from stu_buck2 tablesample(bucket 2 out of 8 on id);

    从第2桶开始抽,一共抽0.5桶!

    抽1号桶的一半

    然而,当我自己实验时,发现实际情况跟预期有偏差

    建表语句:

    --创建分桶表
    create table people (id int,name string)
    clustered by (id)
    sorted by (name desc) into 4 buckets
    row format  delimited fields terminated by '	';
    --创建临时表
    create table tmp (id int,name string)
    row format delimited fields terminated by '	';
    --加载数据
    load data local inpath '/home/guigu/data.txt' into table tmp;
    --加载数据到分桶表
    insert overwrite table people 
    select * from tmp;

    数据:

    1    jake
    1    mike
    2    ace
    3    luffey
    4    namy
    5    franky
    2    zoro
    3    sanji
    4    usoop
    3    kapu
    2    jinx
    1    jake1
    1    mike1
    2    ace1
    3    luffey1
    4    namy1
    5    franky1
    2    zoro1
    3    sanji1
    4    usoop1
    3    kapu1
    2    jinx1
    6    usoop4
    7    kapu4
    8    jin3
    9    jake5
    6    mike2
    7    ace4
    8    luffey3
    9    namy5
    6    franky2
    7    zoro3
    8    sanji5
    9    usoop5
    6    kapu4
    7    jinx2
    8    kap
    9    jin
    data

    分好的桶如下

     然而查询时却发现  本来打算取第2个桶里的4/8 数据,但返回的数据跟预期差得很多

     其实    

    select * from 分桶表 tablesample(bucket x out of y on 分桶字段);
    这个抽样查询的底层是把所有数据按照 字段的hash值 % y 分成y 个 区(相当于Hadoop里的分区),然后取第 x 区 中的数据。
    之所以没有达到预期的效果,是因为用来测试的数据太少!

  • 相关阅读:
    《深入V8引擎-第01课》
    《各 JavaScript 引擎的简介,及相关资料》
    《【前端性能】必须要掌握的原生JS实现JQuery》
    《[iOS][OC] 开发利器:控制器传送门VCPicker(附demo)》
    《iOS 上的 CSS 样式协议 VKCssProtocol》
    ICML 2019论文录取Top100:谷歌霸榜
    进阶!自然语言处理背后的数据科学
    学界!关于GAN的灵魂七问
    如何优化深度学习模型
    从DeepNet到HRNet,这有一份深度学习“人体姿势估计”全指南
  • 原文地址:https://www.cnblogs.com/yangxusun9/p/12430857.html
Copyright © 2011-2022 走看看