18Hive中DDL与分区(hive学习1)

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.给出数据,对照数据创立数据库.png
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';

2查询详细表数据

注意:location中hdfs://bjsxt(集群名称,在我前文中搭建的名字为mycluster。当时用的默认的配置(在core.site配置的))/user/hive/warehouse/psn


3.删除原来的psn,新建表psn
4.建好后查看psn
5发现格式定义.png

DML

6.新建文件夹.png
7.填入数据.png
8加载.png

在这里引入几篇我写文章时遇到问题查询的博客
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/';

9.新建文件夹并把data数据放入.png
10在node4上创建表.png
11查看.png
12删除表psn(内部表).png
13在之前安装的node1中mysql并未发现psn.png
14删除psn4(外部表).png

15数据源还在.png
内部表和外部表的区别(面试会问):

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';
16.在客户端node4上创建
17查看结构可以发现新加了partition information(分区信息)

18.往分区加载数据,查看数据

19查看浏览器

双分区

理论上说,分区无限制,可以无数个。但是一般不会。
原因:越多的话,意味着文件目录越深。查找会更麻烦。整个集群默认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
20发现存在两个分区

21此时age=20已经不行了,必须要age,sex都配置.png

注意:插入值是按照名称匹配来插入的。并不是顺序。只要字段名正确即可。比如

load data local inpath '/root/data/data' into table psn6 partition(sex='man',age=20)

也是可以的
load数据做了几件事:2件,1.创建目录2.接下来做copy或者move这类事
添加:


22修改(必须两个属性加上)
23这时会发现没有数据(这种操作只建目录,不导入数据)

24删除,只用一个属性就可以,加要两个

添加分区的时候,必须在现有分区的基础之上
删除分区的时候,会将所有存在的分区都删除

分区是元数据吗?

首先弄清楚什么是元数据和表数据:元数据就是表的属性数据,表的名字,列信息,分区等标的属性信息,它是存放在RMDBS传统数据库中的(如,mysql)。表数据就是表中成千上万条数据了。

hive的存储过程:启动hive时,会初始化hive,这时会在mysql中生成大约36张表(后续随着业务的复杂会增加),然后创建表,会在mysql中存放这个表的信息(不是以表的形式存在的,而是把表的属性以数据的形式放在mysql中,这样在hive中使用sql命令一样是能够查到这张表的)。然后把本地的文本文件使用hive命令格式化导入到表中,这样这些数据就存放到hdfs中,而不是在mysql或hive中。

25在mysql中查看分区信息

26新建目录,放入数据.png

27不会读到.png

分区属于元数据,每次查询前会查询元数据所属的服务。查询到对应值才会在对应分区查取数据。

28msck repair 后可以查到.png

HIVE常用命令之MSCK REPAIR TABLE命令简述
只需要运行MSCK REPAIR TABLE命令,hive就会去检测这个表在hdfs上的文件,把没有写入metastore的分区信息写入metastore。

29第二种.png

30这种只会复制结构,并不会复制数据.png

你可能感兴趣的:(18Hive中DDL与分区(hive学习1))