精华内容
下载资源
问答
  • Hive分区分桶

    2021-09-08 10:58:21
    分区查找提高查询效率,分桶是对分区更细粒度的划分, 为什么要分桶? 在分区数量过于庞大以至于可能导致文件系统崩溃时,我们就需要使用分桶来解决问题了 在数据量足够大的情况下,分桶分区,更高的查询效率...

    在这里插入图片描述
    场景:例如网站的日志文件,微博博文统计按日期存放等,数据量巨大的情况,

    • 分区查找提高查询效率,分桶是对分区更细粒度的划分,

    为什么要分桶?

    • 在分区数量过于庞大以至于可能导致文件系统崩溃时,我们就需要使用分桶来解决问题了

    • 在数据量足够大的情况下,分桶比分区,更高的查询效率。
      索引 :空间换时间 分区:时间换空间

    • 索引和分区最大的区别就是索引不分割数据库,分区分割数据库。

    • 索引其实就是拿额外的存储空间换查询时间,但分区已经将整个大数据库按照分区列拆分成多个小数据库了。

    • 分区和分桶最大的区别就是分桶随机分割数据库,分区是非随机分割数据库。因为分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜。

    • 其次两者的另一个区别就是分桶是对应不同的文件(细粒度),分区是对应不同的文件夹(粗粒度)。

    • 普通表(外部表、内部表)、分区表这三个都是对应HDFS上的目录,桶表对应是目录里的文件。

    • hive查询时通常是是全表扫描,这样将导致大量的不必要的数据扫描,从而大大减低查询效率,从而引进分区技术,使用分区技术,避免hive全表扫描,提升查询效率,可以将用户的整个表的数据在存储时划分到多个子目录,从而在查询时可以指定查询条件。

    展开全文
  • hive分区分桶

    2020-05-10 14:08:35
    分桶指的是分桶表的某一列,让该列按照hash取模的方式随机均匀的分布在各个中,因为分桶需要根据某一列...hive分区指单值分区、范围分区,单值分为静态和动态分区2种, 单值分区 单值分区根据插入时是否需要手动..

    分桶指的是分桶表的某一列,让该列按照hash取模的方式随机均匀的分布在各个桶中,因为分桶需要根据某一列具体数据来进行hash取模,因此指定的分桶列必须位于表中的一列,分桶改变了数据的存储方式,他会把hash模相同或者在某一区间的数据放一个桶中,来提高查询效率,比如我们要对2张在同一列的表进行分桶操作的表进行join时候,只需要对保存相同列值的桶进行join操作即可,分桶可以使取样更高效

     

    hive分区指单值分区、范围分区,单值分为静态和动态分区2种,

     

    单值分区

    单值分区根据插入时是否需要手动指定分区可以分为:单值静态分区=====>(导入数据时需要手动指定分区)以及单值动态分区=====>(导入数据时,系统可以判断目标分区)

    单值分区表的创建直接定义或者create table like   单值分区表不能用 CREATE
    TABLE AS SELECT 建表。而范围分区表只能通过直接定义列来建表

     

    1静态分区创建 

    直接在partitioned by后面跟上分区键、类型即可(分区键不能和任何列重名)

    create [external] table <table_name>

      (<col_name><data_type>[,<col_name><data_type>...])

    --指定分区键和数据类型

    partitioned by(<partitioned_key><data_type>,...)

    [clustered by ...]

    [row format <row_format>]

    [stored as TEXTFILE|ORC|CSVFILE]

    [location '<file_path>']

    [tblproperties ('<property_name>'='<proper_value>',...)];

     

     

    2静态分区写入

    a======覆盖写入

    insert overwrite table <table_name>

          partitioned (<partitioned_key>=<partityoned_value>[,<partitioned_key>=<partityoned_value>,...])

    展开全文
  • 分桶的意义如何使用分桶分区分桶表 为什么有分区 随着系统运行时间增长,表的数据量越来越大,使用分区技术可以指定条件,缩小数据扫描的范围,避免hive全表扫描,提升查询效率 可以将用户的整个表的数据 划分到多...

    为什么有分区

    • 随着系统运行时间增长,表的数据量越来越大,使用分区技术可以指定条件,缩小数据扫描的范围,避免hive全表扫描,提升查询效率
    • 可以将用户的整个表的数据 划分到多个子目录,

    怎么分区

    • 根据业务,通常按照年月日、地区

    如何使用分区

    • PARTITION BY(col_name data_type)
    • hive的分区字段使用的是表外字段。而mysql使用的是表内字段。
    • hive的分区名区分大小写
    • hive的分区本质是在表目录下面创建目录,但是该分区字段是一个伪列,不真实存在于数据中
    • 一张表可以有一个或者多个分区,分区下面也可以有一个或者多个分区
    • 双分区partitioned by (date_time string,type string),在文件系统中的表现为date_time为一个文件夹,type为date_time的子文件夹。
    • 动态分区列必须在 SELECT 语句中的最后一个列中指定,且顺序与它们在 PARTITION() 子句中出现的顺序相同。
    • 动态分区需要开启 set hive.exec.dynamic.partition = true; hive.exec.dynamic.parition.mode=nonstrict;
    -- 创建静态分区 数据加载到指定的分区
    create table if not exists part1(
    	uid int,
      uname string,
      uage int
    )PARTITION BY (country string)
    row format delimiterd fileds terminated by ',';
    (stored as ORC| SequenceFile) ORC、 SequenceFile都是存储方式
    (loacation 地址)
    -- 导入数据 需要指定分区 数据未知,根据分区值确定创建分区
    load data local inpath '/usr/loacl/xxx'
    into table part1 partition(country='China');
    
    -- 开启动态分区 默认为false,不开启
    set hive.exec.dynamic.partition=true;
    -- 创建动态双分区
    create table if not exists dt_part1(
      uid int,
      uname string,
      uage int
    )
    PARTITIONED BY (year string,month string)
    row format delimited fields terminated by ',';
    -- 在文件系统中的表现为date_time为一个文件夹,type为date_time的子文件夹。
    
    -- 追加写入数据
    insert into dy_part1 partition(year,month)
    select * from part_tmp;
    -- 覆盖写入数据
    insert overwrite dy_part1 partition(year,month)
    select * from part_tmp;
    
    -- 混合分区
    create table if not exists dy_part2(
    	uid int,
    	uname string,
    	uage int
    )
    PARTITIONED BY (year string,month string)
    row format delimited fields terminated by ',';
    -- 插入数据
    insert into dy_part2 partition(year='2018',month)
    select uid,uname,uage,month from part_tmp;
    
    -- 多个范围分区键
    create table test_demo (value int)
    partitioned by range (id1 INT, id2 INT, id3 INT)
    (
    -- id1在(--∞,5]之间,id2在(-∞,105]之间,id3在(-∞,205]之间
      partition p5_105_205 VALUES LESS THAN (5, 105, 205),
      -- id1在(--∞,5]之间,id2在(-∞,115]之间,id3在(-∞,+∞]之间
      partition p5_115_max VALUES LESS THAN (5, 115, MAXVALUE)
    )
    
    -- 查看分区数据
    select * from part1 where country = 'China';
    
    -- 显示分区
    show partitions part1;
    -- 增加分区
    alter table part1 add partition(country = 'india') partition(country = 'America');
    -- 增加分区并设置数据
    alter table part1 add partition(country = 'xxx')
    location 'user/hive/warehouse/xxx'
    -- 修改分区的存储路径 hdfs路径必须是全路径
    alter table part1 partition(country='Vietnam') 
    set location 'hdfs://hadoop01:9000/user/hive/warehouse/brz.db/part1/country=Vietnam'
    -- 删除分区
    alter table part1 drop partition(country = 'india')
    
    
    -- 手动向hdfs中创建分区目录,添加数据,创建好hive的外表之后,无法加载数据,
    -- 元数据中没有相应的记录
    msck repair table tablename
    

    分区注意事项

    • hive的分区使用的表外字段,分区字段是一个伪列但是可以查询过滤。
    • 分区使用的是表外字段,分桶使用的是表内字段
    • 分区字段不建议使用中文
    • 不太建议使用动态分区。因为动态分区将会使用mapreduce来查询数据,如果分区数量过多将导致namenode和yarn的资源瓶颈。所以建议动态分区前也尽可能之前预知分区数量。
    • 分区属性的修改均可以使用手动元数据和hdfs的数据内容
    • 在hive中的数据是存储在hdfs中的**,我们知道hdfs中的数据是不允许修改只能追加的**,那么在hive中执行数据修改的命令时,就只能先找到对应的文件,读取后执行修改操作,然后重新写一份文件。如果文件比较大,就需要大量的IO读写。在hive中采用了分桶的策略,只需要找到文件存放对应的桶,然后读取再修改写入即可。

    为什么要分桶?

    • 单个分区或者表中的数据量越来越大,当分区不能更细粒的划分数据时,所以会采用分桶技术将数据更细粒度的划分和管理。

    分桶的意义

    • 分桶是更细粒度的划分、管理数据,更多用来做数据抽样、JOIN操作
    • 大表在JOIN的时候,效率低下。如果对两个表先分别按id分桶,那么相同id都会归入一个桶。那么此时再进行JOIN的时候是按照桶来JOIN的,那么大大减少了JOIN的数量
    • 数据抽样的时候,也不需要扫描整个文件。只需要对每个分区按照相同规则抽取一部分数据即可。
    • 原始数据中加入一些额外的结构,这些结构可以用于高效的查询,例如,基于ID的分桶可以使得用户的查询非常的块。

    如何使用分桶

    • 定义:

      • clustered by (uid) – 指定分桶的字段
      • sorted by (uid desc) – 指定数据的排序规则,表示预期的数据就是以这里设置的字段以及排序规则来进行存储
      • into x buckets 放进几个桶里
      • 分区使用的是表外字段,分桶使用的是表内字段
      • 分桶数和reduce数对应 一个文件对应一个分桶
      • hash 值为 20 的 HDFS 目录为:/ warehouse /app/dt =20100801/ctry=US/part-00020
    • 导入数据

      • 导入数据有两种,一种是通过文件导入,但是并不会真正的分桶,load data只是把文件上传到 表所在的HDFS目录下。并没有做其他操作 ;一种是通过从其他表插入的方式导入数据,这种方式才能真正的分桶;

      • cluster by (uid) – 指定getPartition以哪个字段来进行hash散列,并且排序字段也是指定的字段,默认以正序进行排序

      • distribute by(uid) – 指定getPartition以哪个字段来进行hash散列

      • sort by(uid asc) – 指定排序字段,以及排序规则,更灵活的方式,这种数据获取方式可以分别指定getPartition的字段和sort的字段

      • 方式1

        • 打开enforce bucketing开关,设置强制分桶属性 set hive.enforce.bucketing=true 2.x版本不需要
        • 设置reduces数为-1: hive.enforce.bucketing为true时,reduce要设为-1;
        • insert overwrite table buc1 select uid,uname,uage from buc_temp;
        • 得到的分桶对应的文件,数据是无序的,也就是 sorted by 或 sort by无效)
      • 方式2

        • 关闭强制分桶 set hive.enforce.bucketing = false
        • 将reducer个数设置为目标表的桶数,并在 SELECT 语句中用 DISTRIBUTE BY <bucket_key>
          – 对查询结果按目标表的分桶键分进reducer中。
        • set mapred.reduce.tasks = num_buckets
        • insert into table buc1 select uid,uname,uage from buc_temp distribute by (uid) sort by (uage desc);
      • cluster by (uid)与distribute by(uid) sort by (uid asc)结果是一样的

    • 抽样语句 :tablesample(bucket x out of y)

      • y必须是table总共bucket数的倍数或者因子。

      • 例如:table总共分了64份,当y=32时,抽取2(64/32)个bucket的数据,当y=128时,抽取1/2(64/128)个bucket的数据。x表示从哪个bucket开始抽取。

      • 例如:table总共bucket数为32,tablesample(bucket 3 out of 16)表示总共抽取2(32/16)个bucket的数据,分别为第三个bucket和第19(3+16)个bucket的数据。

      • select * from table_name tablesample(n percent) 抽出n%的数据 全表扫描

      • 如果在 TABLESAMPLE 子句中指定的列与 CLUSTERED BY 子句中的列相匹配,则 TABLESAMPLE 只扫描表中要求的哈希分区【就是具体的桶】

    --创建一个分桶表 并且指定排序字段及排序规则
    create table if not exists buc1(
      uid int,
      uname string,
      uage int
    )
    clustered by (uid) 
    sorted by(uid desc) into 4 buckets
    row format delimited fields terminated by ',';
    
    -- cluster by (uid)指定getPartition以哪个字段来进行hash散列,并且排序字段也是指定的字段,默认以正序进行排序
    -- distribute by(uid) – 指定getPartition以哪个字段来进行hash散列
    
    -- 加载数据 方式1
    -- 打开enforce bucketing开关,设置强制分桶属性
    set hive.enforce.bucketing=true
    set mapred.reduce.tasks = -1
    insert overwrite table buc1
    select uid,uname,uage from buc_temp
    sort by (uid);
    
    -- 加载数据 方式2
    -- 将reducer个数设置为目标表的桶数,并在 SELECT 语句中用 DISTRIBUTE BY <bucket_key>
    -- 对查询结果按目标表的分桶键分进reducer中。
    set hive.enforce.bucketing = false
    set mapred.reduce.tasks = num_buckets
    insert into table buc1
    select uid,uname,uage from buc_temp
    distribute by (uid) sort by (uage desc);
    
    -- 查看表结构
    desc formatted tablename;
    
    -- 分桶查询结果
    select * from buc1 cluster by (uid);
    '''
    	采样 TABLESAMPLE(BUCKET x OUT OF y) 
    	x:表示从哪个 bucket 开始抽取数据 y:必须为该表总 bucket 数的倍数或因子
    '''
    -- 查询第几桶 取出 uid % 4 == 0的数据
    select * from buc1 tablesample(bucket 1 out of 4 on uid); 
    -- 查询uid 为奇数
    select * from buc1 tablesample(bucket 2 out of 2 on uid)
    -- 随机查询三条数据
    select * from part_tmp order by rand() limit 3;
    
    select * from part_tmp tablesample(0.1 percent) ;
    
    

    分区分桶表

    • 例子也可参考 https://www.studytime.xin/article/hive-partition-and-bucket.html
    -- 按照性别进行分区(1男2女),在分区中按照uid的奇偶进行分桶:
    -- 分区使用的是表外字段,分桶使用的是表内字段
    1 gyy1 1
    2 gyy2 2
    3 gyy3 2
    4 gyy4 1
    5 gyy5 2
    6 gyy6 1
    7 gyy7 1
    8 gyy8 2
    9 gyy9 1
    10 gyy10 1
    11 gyy11 2
    12 gyy12 1
    
    -- 创建带有分区的分桶表
    create table if not exists stus(
    	uid int,
    	uname string
    )
    partitioned by(sex int)
    clustered by(uid) into 2 buckets
    row format delimited filed terminated by ' ';
    -- 创建临时表
    create table if not exists stu_temp(
    	uid int,
    	uname string,
    	usex int
    )
    row format delimited fields terminated by ' ';
    
    -- 临时表中添加数据
    load data local inpath '/usr/local/hivedata/stu.dat' into table stu_temp
    -- 分桶表中加数据
    insert into table stus partition(sex)
    select uid,uname,usex from stu_temp
    cluster by (uid);
    
    -- 查询性别为女性的、并且学号为奇数的学生:
    select * from stus tablesample(bucket 2 out of 2 on uid)
    where sex=2;
    
    展开全文
  • 深入理解 Hive 分区分桶 (Inceptor)

    万次阅读 多人点赞 2018-08-31 17:36:11
    大数据核心原理与实践专栏 为何分区分桶 ...在Hive数仓中也有分区分桶的概念,在逻辑上分区表与未分区表没有区别,在物理上分区表会将数据按照分区键的列值存储在表目录的子目录中,目录名=“分区...

    大数据核心原理与实践专栏

    为何分区分桶

    我们知道传统的DBMS系统一般都具有表分区的功能,通过表分区能够在特定的区域检索数据,减少扫描成本,在一定程度上提高查询效率,当然我们还可以通过进一步在分区上建立索引进一步提升查询效率。在此就不赘述了。

    在Hive数仓中也有分区分桶的概念,在逻辑上分区表与未分区表没有区别,在物理上分区表会将数据按照分区键的列值存储在表目录的子目录中,目录名=“分区键=键值”。其中需要注意的是分区键的值不一定要基于表的某一列(字段),它可以指定任意值,只要查询的时候指定相应的分区键来查询即可。我们可以对分区进行添加、删除、重命名、清空等操作。因为分区在特定的区域(子目录)下检索数据,它作用同DNMS分区一样,都是为了减少扫描成本。

    分桶则是指定分桶表的某一列,让该列数据按照哈希取模的方式随机、均匀地分发到各个桶文件中。因为分桶操作需要根据某一列具体数据来进行哈希取模操作,故指定的分桶列必须基于表中的某一列(字段)。因为分桶改变了数据的存储方式,它会把哈希取模相同或者在某一区间的数据行放在同一个桶文件中。如此一来便可提高查询效率,如:我们要对两张在同一列上进行了分桶操作的表进行JOIN操作的时候,只需要对保存相同列值的桶进行JOIN操作即可。同时分桶也能让取样(Sampling)更高效。

     

    分区

    Hive(Inceptor)分区又分为单值分区、范围分区。单值分区又分为静态分区和动态分区。我们先看下分区长啥样。如下,假如有一张表名为persionrank表,记录每个人的评级,有id、name、score字段。我们便可以创建分区rank(注意rank不是表中的列,我们可以把它当做虚拟列),并将相应数据导入指定分区(将数据插入指定目录)。

    单值分区

    单值分区根据插入时是否需要手动指定分区可以分为:单值静态分区:导入数据时需要手动指定分区。单值动态分区:导入数据时,系统可以动态判断目标分区。

    单值分区表的建表方式有两种:直接定义列和 CREATE TABLE LIKE。注意,单值分区表不能用 CREATE
    TABLE AS SELECT 建表。而范围分区表只能通过直接定义列来建表。

    1、静态分区创建

    直接在 PARTITIONED BY 后面跟上分区键、类型即可。(分区键不能和任何列重名

    CREATE [EXTERNAL] TABLE <table_name>
        (<col_name> <data_type> [, <col_name> <data_type> ...])
        -- 指定分区键和数据类型
        PARTITIONED BY  (<partition_key> <data_type>, ...) 
        [CLUSTERED BY ...] 
        [ROW FORMAT <row_format>] 
        [STORED AS TEXTFILE|ORC|CSVFILE]
        [LOCATION '<file_path>']    
        [TBLPROPERTIES ('<property_name>'='<property_value>', ...)];
    

    2、静态分区写入

    -- 覆盖写入
    INSERT OVERWRITE TABLE <table_name> 
        PARTITION (<partition_key>=<partition_value>[, <partition_key>=<partition_value>, ...]) 
        SELECT <select_statement>;
    
    -- 追加写入
    INSERT INTO TABLE <table_name> 
        PARTITION (<partition_key>=<partition_value>[, <partition_key>=<partition_value>, ...])
        SELECT <select_statement>;
    
    
    

    3、动态分区创建

    创建方式与静态分区表完全一样,一张表可同时被静态和动态分区键分区,只是动态分区键需要放在静态分区建的后面(因为HDFS上的动态分区目录下不能包含静态分区的子目录),如下 spk 即 static partition key, dpk 即 dynamic partition key。

    CREATE TABLE <table_name>
     PARTITIONED BY ([<spk> <data_type>, ... ,] <dpk> <data_type>, [<dpk>
    <data_type>,...]);
    -- ...略

    4、动态分区写入

    静态分区键要用 <spk>=<value> 指定分区值;动态分区只需要给出分出分区键名称 <dpk>。

    -- 开启动态分区支持,并设置最大分区数
    set hive.exec.dynamic.partition=true;
    set hive.exec.max.dynamic.partitions=2000;
    
    -- <dpk>为动态分区键, <spk>为静态分区键
    INSERT (OVERWRITE | INTO) TABLE <table_name>
        PARTITION ([<spk>=<value>, ..., ] <dpk>, [..., <dpk>]) 
        SELECT <select_statement>; 
    

    范围分区

    单值分区每个分区对应于分区键的一个取值,而每个范围分区则对应分区键的一个区间,只要落在指定区间内的记录都被存储在对应的分区下。分区范围需要手动指定,分区的范围为前闭后开区间 [最小值, 最大值)。最后出现的分区可以使用 MAXVALUE 作为上限,MAXVALUE 代表该分区键的数据类型所允许的最大
    值。

    CREATE [EXTERNAL] TABLE <table_name>
        (<col_name> <data_type>, <col_name> <data_type>, ...)
        PARTITIONED BY RANGE (<partition_key> <data_type>, ...) 
            (PARTITION [<partition_name>] VALUES LESS THAN (<cutoff>), 
                [PARTITION [<partition_name>] VALUES LESS THAN (<cutoff>),
                  ...
                ]
                PARTITION [<partition_name>] VALUES LESS THAN (<cutoff>|MAXVALUE) 
            )
        [ROW FORMAT <row_format>] [STORED AS TEXTFILE|ORC|CSVFILE]
        [LOCATION '<file_path>']    
        [TBLPROPERTIES ('<property_name>'='<property_value>', ...)];
    

    eg:多个范围分区键的情况:

    DROP TABLE IF EXISTS test_demo;
    CREATE TABLE test_demo (value INT)
    PARTITIONED BY RANGE (id1 INT, id2 INT, id3 INT)
    (
    -- id1在(--∞,5]之间,id2在(-∞,105]之间,id3在(-∞,205]之间
    PARTITION p5_105_205 VALUES LESS THAN (5, 105, 205),
    -- id1在(--∞,5]之间,id2在(-∞,105]之间,id3在(205,215]之间
    PARTITION p5_105_215 VALUES LESS THAN (5, 105, 215),
    PARTITION p5_115_max VALUES LESS THAN (5, 115, MAXVALUE),
    PARTITION p10_115_205 VALUES LESS THAN (10, 115, 205),
    PARTITION p10_115_215 VALUES LESS THAN (10, 115, 215),
    PARTITION pall_max values less than (MAXVALUE, MAXVALUE, MAXVALUE)
    );

     

    分桶

    说完分区,我们来继续搞分桶。对Hive(Inceptor)表分桶可以将表中记录按分桶键的哈希值分散进多个文件中,这些小文件称为桶。

    创建分桶表

    我们先看一下创建分桶表的创建,分桶表的建表有三种方式:直接建表,CREATE TABLE LIKE 和 CREATE TABLE AS SELECT ,单值分区表不能用 CREATETABLE AS SELECT 建表。这里以直接建表为例:

    CREATE [EXTERNAL] TABLE <table_name>
        (<col_name> <data_type> [, <col_name> <data_type> ...])]
        [PARTITIONED BY ...] 
        CLUSTERED BY (<col_name>) 
            [SORTED BY (<col_name> [ASC|DESC] [, <col_name> [ASC|DESC]...])] 
            INTO <num_buckets> BUCKETS  
        [ROW FORMAT <row_format>] 
        [STORED AS TEXTFILE|ORC|CSVFILE]
        [LOCATION '<file_path>']    
        [TBLPROPERTIES ('<property_name>'='<property_value>', ...)];
    

    分桶键只能有一个即<col_name>。表可以同时分区和分桶,当表分区时,每个分区下都会有<num_buckets> 个桶。我们也可以选择使用 SORTED BY … 在桶内排序,排序键和分桶键无需相同。ASC 为升序选项,DESC 为降序选项,默认排序方式是升序。<num_buckets> 指定分桶个数,也就是表目录下小文件的个数。

    向分桶表写入数据

    因为分桶表在创建的时候只会定义Scheme,且写入数据的时候不会自动进行分桶、排序,需要人工先进行分桶、排序后再写入数据。确保目标表中的数据和它定义的分布一致。

    目前有两种方式往分桶表中插入数据:

    方法一:打开enforce bucketing开关。

    SET hive.enforce.bucketing=true; ①
    INSERT (INTO|OVERWRITE) TABLE <bucketed_table> SELECT <select_statement>
    [SORT BY <sort_key> [ASC|DESC], [<sort_key> [ASC|DESC], ...]]; ②

    方法二:将reducer个数设置为目标表的桶数,并在 SELECT 语句中用 DISTRIBUTE BY <bucket_key>对查询结果按目标表的分桶键分进reducer中。

    SET mapred.reduce.tasks = <num_buckets>; 
    INSERT (INTO|OVERWRITE) TABLE <bucketed_table>
    SELECT <select_statement>
    DISTRIBUTE BY <bucket_key>, [<bucket_key>, ...] 
    [SORT BY <sort_key> [ASC|DESC], [<sort_key> [ASC|DESC], ...]]; 
    • 如果分桶表创建时定义了排序键,那么数据不仅要分桶,还要排序
    • 如果分桶键和排序键不同,且按降序排列,使用Distribute by … Sort by分桶排序
    • 如果分桶键和排序键相同,且按升序排列(默认),使用 Cluster by 分桶排序,即如下:
    SET mapred.reduce.tasks = <num_buckets>;
    INSERT (INTO|OVERWRITE) TABLE <bucketed_table>
    SELECT <select_statement>
    CLUSTER BY <bucket_sort_key>, [<bucket_sort_key>, ...];

     

    另外补充说明一下,在Hive(Inceptor)中,ORC事务表必须进行分桶(为了提高效率)。每个桶的文件大小应在100~200MB之间(ORC表压缩后的数据)。通常做法是先分区后分桶。

     

     


     

    展开全文
  • Hive 分区 分桶使用

    千次阅读 2018-01-22 17:17:33
    为了对表进行合理的管理以及提高查询效率,Hive可以将表组织成“分区”。  分区是表的部分列的集合,可以为频繁使用的数据建立分区,这样查找分区中的数据时就不需要扫描全表,这对于提高查找效率很有帮助。 ...
  • 大数据核心原理与实践专栏 为何分区分桶 ...在Hive数仓中也有分区分桶的概念,在逻辑上分区表与未分区表没有区别,在物理上分区表会将数据按照分区键的列值存储在表目录的子目录中,目录名=“分区键=键...
  • hive分区分桶操作及加载数据

    千次阅读 2017-10-18 16:33:41
    转载来自:...Hive 已是目前业界最为通用、廉价的构建大数据时代数据仓库的解决方案了,虽然也有 Impala 等后起之秀,但目前从功能、稳定性等方面来说,Hive 的地位尚不
  • Hive分区分桶基本操作

    2018-01-15 13:23:32
    重置HIVE 登录mysql [root@m ~]# mysql -uroot -p1 ->MySQL drop database hive; create database hive; --修改数据库编码 alter database grant all on hive.* to hive@'%' identified by '1'; grant all ...
  • Hive分区分桶的区别

    2019-10-20 11:00:50
    https://blog.csdn.net/qq_42246689/article/details/84671926
  •    Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键。    Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapReduce任务中需要读取的数据块的...
  • 前言: 互联网应用, 当Mysql单机遇到性能瓶颈时, 往往采用的优化策略是库分表... 分区分桶作为Hive的优化的一个有力武器. *). 分区(静态、动态)  Hive没有索引, 查询中一般会扫描整个表内容,会消耗很多时间...
  • 导入数据: 1、 load data local inpath '/root/... 将本地的数据导入到hive中 2、从hdfs集群导入数据 load data inpath 'hdfs://node01:9000/user/tes.txt' into table test.te; LOAD DATA命令,可分为LOAD DA...
  • Hive分区&分桶

    2021-01-13 01:42:28
    分桶一、Hive分区分区常见操作:2、Hive 静态分区3、动态分区分区细节:二、Hive 分桶Hive 分桶应用场景 一、Hive分区 粗粒度的划分 业界常用日作为分区 分区作用:减少查询的数据量、提高查询效率 通过partition by...
  • 彻底搞懂 hive分区表 hive分桶Hive分区分桶的区别 Hive分区分桶的优缺点 spark分区 spark分桶
  • hive分区分桶

    2019-03-23 10:33:57
    hive的分区、分桶 一、分区 1.为什么要分区 当单个表数据量越来越大的时候,hive查询通常会全表扫描,这将会浪费我们不关心数据的扫描,浪费...3.hive分区和mysql分区的区别 mysql的分区字段采用的表内字段。 hive...
  • Hive-分区分桶

    2017-03-06 21:04:40
    Hive分区分桶
  • Hive分区分桶

    2020-12-09 16:53:30
    Hive分区分桶一、Hive分区分区主要用于提高性能1、静态分区1.单级分区2.多级分区2、静态分区二、Hive分桶 一、Hive分区 分区主要用于提高性能 1.分区列的值将表划分为一个个的文件夹 2.查询时语法使用"分区"列和...
  • Hive分区分桶操作及其比较

    万次阅读 多人点赞 2014-12-13 17:39:29
    1,Hive分区。 是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的...
  • Hive分区分桶的区别1.hive分区2.hive分桶 1.hive分区 分区针对的是数据的存储路径,分区提供一个隔离数据和优化查询的便利方式。不过并不是所有的数据集都可形成合理的分区。 create table student_partitioned...
  • Hive分区/分桶

    2021-01-07 08:51:34
    分区表: 创建分区表 ​ create table t_user_partition(id int, name string) ... load data local inpath '/root/hivedata/china.txt' into table t_user_partition partition(country ='china'); load dat
  • Hive分区分桶

    2018-08-06 13:41:59
    使用分区可以加快数据片(slice)的查询速度。 表或分区可以进一步划分为(bucket)。它会为数据提供额外的结构以获取更高效的查询处理。例如,通过根据用户ID来划分,我们可以在所有用户集合的随机样本上...
  • Hive分区分桶

    2020-07-09 08:06:57
    Hive分区分桶 1. Hive分区 1.1 分区的概念 hive分区就是在表目录下建立子目录,方便查找和关理 1.2 静态分区 静态分区就是自己动手指定分区的值。 1.2.1 建立分区表 create table if not exists t_part( id ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,644
精华内容 3,857
关键字:

hive分区分桶