DDL:数据库定义语言
DML:数据库操作语言
DCL:数据库控制语言
Hive的数据类型
: primitive_type
| array_type//数组hive可以存数组
| map_type//kv
| struct_type//结构体。类似于类可以存储不同数据类型的数据只考虑属性,不考虑方法
:primitive_type
|TINYINT
| SMALLINT
| INT
| BIGINT
| BOOLEAN
| FLOAT
| DOUBLE
| STRING
Hive完整的DDL建表语法规则
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)
[(col_name data_type [COMMENT col_comment], ... [constraint_specification])]//列名 数据类型
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[SKEWED BY (col_name, col_name, ...) -- (Note: Available in Hive 0.10.0 and later)]
ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
[STORED AS DIRECTORIES]
[
[ROW FORMAT row_format] //行格式。ROW FORMAT 是关键字,必须要写
[STORED AS file_format]//文件格式,文件存储分为两种一种是行存一种是列存,行存数据文件格式不变。列存会变的
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] -- (Note: Available in Hive 0.6.0 and later)
]
[LOCATION hdfs_path]//文件位置
[TBLPROPERTIES (property_name=property_value, ...)] -- (Note: Available in Hive 0.6.0 and later)//表属性
[AS select_statement]; -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)//子查询
1,小明1,lol-book-movie,beijing:changping-shanghai:pudong
2,小明2,lol-book-movie,beijing:changping-shanghai:pudong
3,小明3,lol-book-movie,beijing:changping-shanghai:pudong
4,小明4,lol-book-movie,beijing:changping-shanghai:pudong
5,小明5,lol-movie,beijing:changping-shanghai:pudong
6,小明6,lol-book-movie,beijing:changping-shanghai:pudong
7,小明7,lol-book,beijing:changping-shanghai:pudong
8,小明8,lol-book,beijing:changping-shanghai:pudong
9,小明9,lol-book-movie,beijing:changping-shanghai:pudong
id int , 姓名 string,爱好 数组类型,住址 map类型
怎么建表?
CREATE TABLE person(
id INT,
name STRING,
age INT,
likes ARRAY,//爱好
address MAP//map中key只能基本类型,v可以为复杂类型
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' //上文中数据用,分割
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
注意:location中hdfs://bjsxt(集群名称,在我前文中搭建的名字为mycluster。当时用的默认的配置(在core.site配置的))/user/hive/warehouse/psn
DML
在这里引入几篇我写文章时遇到问题查询的博客
hive学习(二) hive操作
这篇 Hive HQL学习对于建表的描述更细致,如果有什么问题基本可以在以上得到解决
以上就是内部表
那如何定义外部表?
创建:
create external table psn4 (
id int,
name string,
hobby array,
address map
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n'
location '/usr/';
内部表和外部表的区别(面试会问):
1.创建表的时候:内部表直接存储在默认的hdfs路径,外部表需要自己指定路径
2.删除表的时候:内部表会将数据和元数据删除,外部表只删除元数据,数据不删除。
先有数据再有表,外部表
先有表,再有数据,内部表
写时检查(关系型数据库)输入数据时必须要对输入的数据类型进行检查
读时检查:输入数据时必须要对输入的数据类型进行不检查。(节约时间,提高数据记载的效率)hive采用读时检查是为了实现解耦。数据存储在hdfs,hive只指定读取规则,指定路径,和hdfs无关
Hive分区
Hive 分区partition
必须在表定义时指定对应的partition字段
a、单分区建表语句:
create table day_table (id int, content string) partitioned by (dt string);
单分区表,按天分区,在表结构中存在id,content,dt三列。
以dt为文件夹区分
b、 双分区建表语句:
create table day_hour_table (id int, content string) partitioned by (dt string, hour string);
双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
先以dt为文件夹,再以hour子文件夹区分
实际操作一把
create table psn5 (
id int,
name string,
likes array,
address map
)
partitioned by (age int)//这里并不需要添加age属性,分区列也是一个列
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
双分区
理论上说,分区无限制,可以无数个。但是一般不会。
原因:越多的话,意味着文件目录越深。查找会更麻烦。整个集群默认1000个分区。每个节点默认100个。
hive> create table psn6 (
> id int,
> name string,
> likes array,
> address map
> )
> partitioned by (age int,sex string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ','
> COLLECTION ITEMS TERMINATED BY '-'
> MAP KEYS TERMINATED BY ':'
> LINES TERMINATED BY '\n';
OK
Time taken: 1.167 seconds
注意:插入值是按照名称匹配来插入的。并不是顺序。只要字段名正确即可。比如
load data local inpath '/root/data/data' into table psn6 partition(sex='man',age=20)
也是可以的
load数据做了几件事:2件,1.创建目录2.接下来做copy或者move这类事
添加:
添加分区的时候,必须在现有分区的基础之上
删除分区的时候,会将所有存在的分区都删除
分区是元数据吗?
是
首先弄清楚什么是元数据和表数据:元数据就是表的属性数据,表的名字,列信息,分区等标的属性信息,它是存放在RMDBS传统数据库中的(如,mysql)。表数据就是表中成千上万条数据了。
hive的存储过程:启动hive时,会初始化hive,这时会在mysql中生成大约36张表(后续随着业务的复杂会增加),然后创建表,会在mysql中存放这个表的信息(不是以表的形式存在的,而是把表的属性以数据的形式放在mysql中,这样在hive中使用sql命令一样是能够查到这张表的)。然后把本地的文本文件使用hive命令格式化导入到表中,这样这些数据就存放到hdfs中,而不是在mysql或hive中。
分区属于元数据,每次查询前会查询元数据所属的服务。查询到对应值才会在对应分区查取数据。
HIVE常用命令之MSCK REPAIR TABLE命令简述
只需要运行MSCK REPAIR TABLE命令,hive就会去检测这个表在hdfs上的文件,把没有写入metastore的分区信息写入metastore。