Hive的数据模型

内部表(Table)

内部表与数据库中的Table在概念上是类似的

每一个Table在Hive上都有一个对应的目录存储数据

所有的Table数据(不包括External Table)都保存在这个目录中

删除表时,元数据和数据都会删除

创建内部表

--创建t1表

CREATE TABLE t1(
    tid int,
    tname string,
    age int
);

指定存储数据的位置

CREATE TABLE t2(
    tid int,
    tname string,
    age int
)
LOCATION '/mytable/hive/t2';

指定列分隔符

CREATE TABLE t3(
    tid int,
    tname string,
    age int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

从已有的表创建并指定分隔符为逗号

CREATE TABLE t4 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
AS SELECT * FROM tablename;

分区表(Partition)

使用分区可以提高查询的效率

partition 对应数据库中的Partition列的密集索引

在Hive中,表中的一个Partition对应表下的一个目录,所有的Partition的数据都存储在对应的目录中

创建分区表

CREATE TABLE partition_table(
    sid int,
    sname string
)PARTITIONED BY (gender string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

插入数据

INSERT INTO TABLE partition_table partition(gender='M')
SELECT sid,sname FROM table_name WHERE gender='M';

查看对比分区表与没有分区表的执行计划,执行计划由从上往下,从右往左的顺序。

explain SELECT * FROM partition_table WHERE gender='M';
explain SELECT * FROM student1;

外部表

指向已经在HDFS中存在的数据,可以创建Partition

它和内部表在元数据的组织是相同的,而实际数据的存储则有较大的差异

外部表只有一个过程,加载数据和创建表同时完成,并不会移动数据到数据仓库的目录中,只是与外部数据建立一个链接。当删除一个外部表时,仅删除该链接。

创建外部表

CREATE EXTERNAL TABLE external_student(
    sid int,
    sname string,
    age int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 'hdfs_location';

桶表(Bucket Table)

降低系统的热块,提高查询的速度

桶表是对数据进行哈希取值,然后放到不同的文件中

创建桶表

CREATE TABLE bucket_table(
    sid int,
    sname string,
    age int
)
CLUSTERED BY(sname) INTO 5 BUCKETS;

视图(View)

视图是一种虚表,是一个逻辑概念;可以跨越多张表

视图建立在已有表的基础之上,视图赖以建立的这些表称为基表

视图可以简化复杂的查询

创建视图

CREATE VIEW onion_referrers(url COMMENT 'URL of Referring page')
  COMMENT 'Referrers to The Onion website'
  AS
  SELECT DISTINCT referrer_url
  FROM page_view
  WHERE page_url='http://www.theonion.com';

删除视图

DROP VIEW onion_referrers;

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP在线

mysql索引的类型和优缺点

现在来介绍了数据库索引,及其优、缺点。针对MySQL索引的特点、应用进行了详细的描述。分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何...

40070
来自专栏Albert陈凯

2018-07-20 oracle优化:避免全表扫描

例如:在City-State-Zip列创建了三列复合索引,那么仅对State列限定条件不能使用这个索引,因为State不是索引的主列。

29140
来自专栏mukekeheart的iOS之旅

MySQL学习笔记(二)

二、SQL基本知识 SQL 是一种典型的非过程化程序设计语言,这种语言的特点是:只指定哪些数据被操纵,至于对这些数据要执行哪些操作,以及这些操作是如何执行的,则...

285100
来自专栏c#开发者

oracle 常用command

Lunatic 整理 1. 删除表的注意事项 在删除一个表中的全部数据时,须使用TRUNCATE TABLE 表名;因为用DROP TABLE,DE...

39230
来自专栏杨建荣的学习笔记

MySQL关于数据字典的一个疑问

今天看着MySQL的数据字典,突然想到一个问题:为什么MySQL数据字典 information_schema中的表名是大写,而performance_sche...

37280
来自专栏芋道源码1024

数据库[分库分表]中间件 Sharding-JDBC 源码分析 —— SQL 解析(四)之插入SQL

本文主要基于 Sharding-JDBC 1.5.0 正式版 1. 概述 2. InsertStatement 3. #parse() 3.1 #parseI...

45570
来自专栏资深Tester

增删改查的增删改

25040
来自专栏乐沙弥的世界

PL/SQL --> 存储过程

存储过程子程序的一种类型,能够完成一些任务,作为schema对象存储于数据库。是一个有名字的PL/SQL代码块,支持接收或不接受参数

9330
来自专栏社区的朋友们

MySQL 索引与优化

索引是存储引擎内部的一种数据结构,它能让数据库快速地找到需要的值,而不是野蛮地进行自上而下的全表遍历。索引对良好的性能非常关键,尤其是当表中的数据量越来越大时,...

1.1K10
来自专栏文渊之博

探索SQL Server元数据(三):索引元数据

在第一篇中我介绍了如何访问元数据,元数据为什么在数据库里面,以及如何使用元数据。介绍了如何查出各种数据库对象的在数据库里面的名字。第二篇,我选择了触发器的主题,...

24210

扫码关注云+社区

领取腾讯云代金券