zoukankan      html  css  js  c++  java
  • [Hive_8] Hive 设计优化


    0. 说明

      在 Hive 中,数据库是一个文件夹,表也是文件夹

      partition,是一个字段,是文件

      前提:在 Hive 进行 where 子句查询的时候,会将条件语句和全表进行比对,搜索出所需的数据,性能极差,partition 就是为了避免全表扫描

      bucket(桶表)

      避免多级分区导致分区目录过多,以指定字段进行 hash 分桶

      新型数据结构,以文件段的形式在分区表内部按照指定字段进行分隔

      重要特性:优化 join 的速度


    1. 分区

      1.1 创建非分区表 user_nopar

        create table user_nopar
        (id int, name string, age int, province string, city string)
        row format delimited
        fields terminated by '	';

      1.2 加载数据

    load data local inpath '/home/centos/files/user_nopar.txt' into table user_nopar;

      1.3 创建分区表 user_par

        create table user_par(id int, name string, age int)
        partitioned by(province string, city string)
        row format delimited
        fields terminated by '	';

      1.4 手动添加分区

      alter table user_par add partition(province='beijing',city='beijing');

      1.5 将数据加载到指定分区(分区可以不存在)

      load data local inpath '/home/centos/files/customers.txt' 
      into table user_par
      partition (province='shanxi',city='taiyuan');

      1.6 将表清空

        truncate table user_par;

      1.7 设置动态分区非严格模式,无需指定静态分区

      set hive.exec.dynamic.partition.mode=nonstrict;

      1.8 插入数据动态指定分区

    insert into user_par
    partition(province,city)
    select * from user_nopar;

       (PS: 在动态插入分区字段时注意,字段顺序必须要和分区顺序保持一致,和字段名称无关)

      1.9 删除分区

    alter table  user_par2 drop partition(province='sichuan');

      1.10 insert 数据到分区表

    insert into user_par2 partition(province='USA', city='NewYork') select 10,'jerry',30;

      1.11 查看指定表的分区

      show partitions user_par2;

      1.12 建立分区的依据

    1. 以日期或时间进行分区 比如 year, month, and day
    2. 以位置进行分区 比如 country, territory, state, and city
    3. 以业务逻辑进行分区

    2. 分桶

      2.1 创建桶表

    create table user_bucket(id int, name string, age int) CLUSTERED BY (id) INTO 2 BUCKETS row format delimited fields terminated by '	';

      2.2 在桶表中转储数据

      insert into user_bucket select id, name , age from user_par2;

      2.3 查看 HDFS 中桶表的数据结构

      2.4 将桶表和分区表一同使用建立新表 user_new, 分区在前

    create table user_new(id int, name string, age int)
    partitioned by (province string, city string)
    CLUSTERED BY (id) INTO 2 BUCKETS
    row format delimited
    fields terminated by '	';

      2.5 通过 load 加载数据

      load 并不会修改表中的数据结构,在桶表中的体现,就是没有将数据进行分段

    load data local inpath '/home/centos/files/customers.txt' into table user_new partition (province='sichaun',city='chengdu');

      2.6 insert 数据

    insert into user_new partition(province='USA', city='NewYork') select 10,'jerry',30;

      2.7 指定分桶字段

      通过 join 字段进行桶字段的确定,在以下场景中分桶字段 a => no , b => uid

    SELECT a.no, a.name, b.oname, b.oprice from customers a inner join orders b on a.no=b.uid;

    3. 内部表 & 外部表

      3.1 内部表

      删除内部表的同时也会删除元数据,删除真实数据
      MANAGED_TABLE 也叫托管表,是默认表类型

      3.2 外部表


      删除外部表的同时只删除元数据,不删除真实数据
      场景:为了防止 drop 或者 truncate 表的时候数据丢失的问题
      创建 external table

        create external table user_external(id int, name string, age int);
    
        insert into user_external select id,name,age from user_par;

  • 相关阅读:
    牛客网 剑指Offer JZ19 顺时针打印矩阵
    牛客网 剑指Offer Z18 二叉树的镜像
    牛客网 剑指Offer JZ17 树的子结构
    一键安装脚本(MySQL双主、EMQX集群、FastDFS集群)
    API和拦截器相关的设计简记
    C# 获取今天,昨天,上周,下周,上月,下月等等一些日期格式
    Element.scrollIntoView()
    自主学习(1)--matlab
    四则运算java
    学习计划
  • 原文地址:https://www.cnblogs.com/share23/p/10225549.html
Copyright © 2011-2022 走看看