• Hive 分区表和分桶表


    一、分区表
    1.1 概念
    Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大。
    
    分区为 HDFS 上表目录的子目录,数据按照分区存储在子目录中。如果查询的 where 字句的中包含分区条件,则直接从该分区去查找,而不是扫描整个表目录,
    合理的分区设计可以极大提高查询速度和性能。 这里说明一下分区表并 Hive 独有的概念,实际上这个概念非常常见。比如在我们常用的 Oracle 数据库中,当表中的数据量不断增大,查询数据的速度就会下降,
    这时也可以对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据存放到多个表空间(物理文件上),这样查询数据时,就不必要每次都
    扫描整张表,从而提升查询性能。
    1.2 使用场景 通常,在管理大规模数据集的时候都需要进行分区,比如将日志文件按天进行分区,从而保证数据细粒度的划分,使得查询性能得到提升。 1.3 创建分区表 在 Hive 中可以使用 PARTITIONED BY 子句创建分区表。表可以包含一个或多个分区列,程序会为分区列中的每个不同值组合创建单独的数据目录。下面的我们
    创建一张雇员表作为测试: CREATE EXTERNAL TABLE emp_partition( empno INT, ename STRING, job STRING, mgr INT, hiredate TIMESTAMP, sal DECIMAL(
    7,2), comm DECIMAL(7,2) ) PARTITIONED BY (deptno INT) -- 按照部门编号进行分区 ROW FORMAT DELIMITED FIELDS TERMINATED BY " " LOCATION '/hive/emp_partition'; 1.4 加载数据到分区表# 加载数据到分区表时候必须要指定数据所处的分区: # 加载部门编号为20的数据到表中 LOAD DATA LOCAL INPATH "/usr/file/emp20.txt" OVERWRITE INTO TABLE emp_partition PARTITION (deptno=20) # 加载部门编号为30的数据到表中 LOAD DATA LOCAL INPATH "/usr/file/emp30.txt" OVERWRITE INTO TABLE emp_partition PARTITION (deptno=30) 1.5 查看分区目录 这时候我们直接查看表目录,可以看到表目录下存在两个子目录,分别是 deptno=20 和 deptno=30,这就是分区目录,分区目录下才是我们加载的数据文件。 # hadoop fs -ls hdfs://hadoop001:8020/hive/emp_partition/
    分区表一般在数据量比较大,且有明确的分区字段时使用,这样用分区字段作为查询条件查询效率会比较高。
    
    Hive分区分为静态分区和动态分区
    
    1、建表语句
    
    静态分区和动态分区的建表语句是一样的。
    create table test_partition (
    id string comment 'ID', 
    name string comment '名字'
    )
    comment '测试分区'
    partitioned by (year int comment '')
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
    
    
    2、插入语句
    
    2.1.1 insert into
    insert into table test_partition partition(year=2018) values ('001','张三');
    insert into table test_partition partition(year=2018) values ('001','张三');
    insert into table test_partition partition(year=2018) values ('002','李四');
    
    2.1.2 load data
    
    load data local inpath '/root/dkl/data/data.txt' into table test_partition partition (year =2018);
    load data local inpath '/root/dkl/data/data.txt' into table test_partition partition (year =2018);
    load data local inpath '/root/dkl/data/data.txt' into table test_partition partition (year =2017);
    3、查看分区信息
    
    show  partitions test_partition;
    

      

  • 相关阅读:
    旧文备份:利用一个定时器实现多个虚拟定时器的两种方法
    TypeScript type 类型别名
    TypeScript 模块系统
    github----awesome-typescript-projects
    synchronous-request-with-websockets
    async await promise
    Sharing Configuration in ASP.NET Core SPA Scenarios
    Unicode String to a UTF-8 TypedArray Buffer in JavaScript
    MVC 访问静态页面 View 下面放JS
    Processing Binary Protocols with Client-Side JavaScript
  • 原文地址:https://www.cnblogs.com/654321cc/p/12172986.html
Copyright © 2020-2023  润新知