第一章.Hive数据类型

1.基本数据类型

HIVE MySQL JAVA 长度 例子
TINYINT TINYINT byte 1byte有符号整数 2
SMALINT SMALINT short 2byte有符号整数 20
INT INT int 4byte有符号整数 20
BIGINT BIGINT long 8byte有符号整数 20
BOOLEAN 无 boolean 布尔类型,true或者false TRUE
FLOAT FLOAT float 单精度浮点数 3.14159
DOUBLE DOUBLE double 双精度浮点数 3.14159
STRING VARCHAR string 字符序列,可以指定字符集,可以使用单引号或双引号 “hello”
TIMESTEAP TIMESTAMP 时间类型
BINARY BINARY 字节数组
  1. 对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过他不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数

2.集合数据类型

数据类型 描述 语法示例
STRUCT 类似于java中的类都可以通过”.”访问元素内容 structstreet:string,city:string
MAP 键值对元组集合 map
ARRAY 数组是一组具有相同类型和名称的变量的集合 array
  1. Hive有三种复杂数据类型ARRAY,MAP和STRUCT,ARRAY和MAP与Java的ARRAY和MAP类似,而STRUCT与C语言中的struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套

2.1 案例实操

  1. // 1.假设某表有如下一行,我们用JSON格式来表示其数据结构,在Hive下访问的格式为
  2. {
  3. "name":"songsong",
  4. "friends":["bingbing" ,"lili"], //列表Array
  5. "children" : { //键值Map
  6. "xiao song":18
  7. "xiaoxiaosong":19
  8. }
  9. "address":{ //结构Struct
  10. "street":"hui long guan",
  11. "city":"beijing",
  12. "email":"10010"
  13. }
  14. }
  1. # 2.基于上述数据结构,我们在Hive里创建对应的表,并导入数据
  2. # 创建本地测试文件 text.txt
  3. songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
  4. yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing

注意MAP,STRUCT和ARRAY里的元素间关系都可以用同一个字符来表示,这里用”-“

  1. #3.Hive上创建测试表test
  2. beeline -u jdbc:hive2://hadoop102:10000 -n atguigu #HIVEJDBC访问
  3. create database db; #创建db数据库
  4. use db; #使用db数据库
  5. create table test(
  6. name string,
  7. friends array<string>,
  8. children map<string,int>,
  9. address struct<street:string,city:string,email:int>
  10. )
  11. row format delimited fields terminated by ','
  12. collection items terminated by "_"
  13. map keys terminated by ':'
  14. lines terminated by '\n';
  1. #4.导入文本数据到测试表
  2. load data local inpath '/home/atguigu/test.txt' into table test;

$02[Hive数据类型_Hive库表的定义] - 图1

  1. # 5.查询集合数据类型中的字段的内容
  2. select friends[1],children['xiao song'],address.city from test where name = "songsong";

$02[Hive数据类型_Hive库表的定义] - 图2

2.2 类型转换

  1. Hive的原子数据类型是可以进行隐式转换的,类似于java的类型转换,例如某表达式使用INT类型,TINYINT会自动转换为INT类型,但是HIve不会进行反向转化,例如,某表达式使用TINYINT类型,INT不会自动转换为TINYINT类型,它会返回错误,除非使用CAST操作
  1. # 隐式类型转换规则
  2. (1)任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
  3. (2)所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。
  4. (3)TINYINT、SMALLINT、INT都可以转换为FLOAT。
  5. (4)BOOLEAN类型不可以转换为任何其它的类型。
  6. # 可以使用CAST操作显示进行数据类型转换
  7. 例如CAST('1' AS INT)将把字符串'1' 转换成整数1;如果强制类型转换失败,如执行CAST('X' AS INT),表达式返回空值 NULL。

第二章 DDL数据定义

1.库的操作

  1. #创建库
  2. CREATE DATABASE [IF NOT EXISTS] 库名
  3. #IF NOT EXISTS :如果库不存在则创建,如果库存在则不创建。如果没该字段库存在时则报错
  4. [COMMENT 库的描述信息]
  5. #comment 定义库的描述信息
  6. [LOCATION 库在HDFS中所对应的路径]
  7. #LOCATION :库在HDFS中所对应的路径
  8. [WITH DBPROPERTIES ('key'='value', ...)];
  9. #WITH DBPROPERTIES :给库设置属性的值。
  10. #注意中括号中的内容是必须的
  1. #创建库的语句
  2. create database if not exists db3
  3. comment 'this is database'
  4. location '/db3'
  5. with dbproperties('name'='longge');
  1. #库的操作
  2. 1.查看库:like:模糊查询
  3. show databases [like '匹配内容'];
  4. 2.查看库详情 :extended可以查看库的属性
  5. desc database [extended] 库名;
  6. 3.切换库:
  7. use 库名;
  8. 4.修改数据库 : 只能修改属性
  9. alter database 库名 set dbproperties('key'='value');
  10. 5.删库:cascade :删除非空的库
  11. #[if exists] : 如果库存在则删除,不存在则不删。如果没有该字段库不存在则报错。
  12. drop database [if exists] 库名 [cascade];

2.表的操作

  1. # 创建表
  2. CREATE [EXTERNAL] TABLE [IF NOT EXISTS] 表名
  3. #[EXTERNAL] : 如果有该字段该表为外部表,如果没有该表为内部表(管理表)
  4. #[IF NOT EXISTS] :如果表不存在则创建,存在则不创建,没有该字段表存在则报错。
  5. [(字段名 字段类型 [COMMENT 字段的描述信息], ...)]
  6. #COMMENT :字段的描述信息
  7. [COMMENT 表的描述信息]
  8. #COMMENT :表的描述信息
  9. [PARTITIONED BY (分区字段名 字段类型 [COMMENT 字段的描述信息], ...)]
  10. #PARTITIONED BY :指定分区字段
  11. [CLUSTERED BY (分桶字段名1, 分桶字段名2, ...)
  12. #CLUSTERED BY :指定分桶字段
  13. [SORTED BY (排序字段 [ASC|DESC], ...)] INTO 桶的数量 BUCKETS]
  14. #SORTED BY :分桶时按照指字段进行排序,一般不用
  15. [ROW FORMAT row_format]
  16. #字段按照什么字符分隔开
  17. delimited fields terminated by ','
  18. #集合数据类(array,map,struct)型用什么分隔开
  19. collection items terminated by '_'
  20. #map的k,v用什么分隔开
  21. map keys terminated by ':'
  22. #每条数据用什么分隔开---默认就是按\n分开。
  23. lines terminated by '\n';
  24. [STORED AS 存储的格式]
  25. #STORED AS :存储格式默认为TextFile
  26. [LOCATION 表所在HDFS的路径]
  27. #LOCATION :指定表在HDFS所在的路径,如果不指定默认在库目录下面。
  28. [TBLPROPERTIES ('key'='value', ...)]
  29. #TBLPROPERTIES :给表指定属性
  30. [AS 查询语句]
  31. #as : 将查询的结果创建成一张新表
  32. [LIKE 存在的表的名称]
  33. #LIKE :根据现有的表结构创建一张新表(没有数据-只有表结构)
  1. # 创建表语句:
  2. create table if not exists student2(
  3. id int comment 'this is id',
  4. name string comment 'this is name'
  5. )
  6. comment 'this is table'
  7. row format delimited fields terminated by '\t'
  8. #1.默认情况下,表就在该库的下面。但是也可以不在一起需要指定。
  9. #2.表映射的路径的名字可以不和表名相同。
  10. location '/demo'
  11. tblproperties('version'='1.0');
  12. 1.AS 查询语句
  13. create table if not exists stu
  14. as
  15. select id,name from student2
  16. where id < 1010;
  17. 2.LIKE 存在的表的名称
  18. create table if not exists stu2
  19. like stu;
# 管理表和外部表
1.创建管理表 --- 删除表时数据也会被删除掉
create table if not exists manager_tbl(
id int comment 'this is id',
name string comment 'this is name'
)
comment 'this is table'
row format delimited fields terminated by '\t'

2.创建外部表 --- 删除表时数据不会被删除
create external table if not exists external_tbl(
id int comment 'this is id',
name string comment 'this is name'
)
comment 'this is table'
row format delimited fields terminated by '\t'
# 表的操作
1.查看所有的表
show tables;
2.删除表
drop table 表名;
3.查看表结构:formatted-查看表的详情
desc [formatted] 表名;
4.内部表和外部表的转换(修改表的属性)
alter table 表名 set tblproperties('EXTERNAL'='TRUE/FALSE');
5.修改表名
ALTER TABLE 旧表名 RENAME TO 新表名;

 ===================1----6和7中当交换字段的顺序时一定要注意数据类型======================    
 ===================2----6和7中当交换字段的顺序时数据不会交换位置========================= 
6.修改列的类型 --- 修改的类型一定要能转化(比如int->string可以,反过来不行)。
ALTER TABLE 表名 CHANGE [COLUMN] 字段名 字段名 新的类型 
[COMMENT 字段的描述信息] [FIRST|AFTER 字段名]
7.修改列的名字
ALTER TABLE 表名 CHANGE [COLUMN] 旧字段名 新字段名 原字段类型 
[COMMENT 字段的描述信息] [FIRST|AFTER 字段名]
===========================================================================================

8.增加列
ALTER TABLE 表名 ADD COLUMNS (字段名 字段类型 [COMMENT 字段的描述信息], ...) 

9.修改列
#①在替换列时,依次替换
#②如果替换的列少于原列,那么将会把没有被替换的列删除掉
#③替换列时一定要注意数据的类型。(原类型string替换的类型int是不可以的)
ALTER TABLE table_name REPLACE COLUMNS (字段名 字段类型 [COMMENT 字段的描述信息], ..., ...)