1. 概述
- 数据定义语言DDL,是SQL语言集中对数据库内部的对象结构进行创建、删除、修改等的操作语言,这些数据库对象包括database、table、view、index等。
- DDL核心语法由CREATE、ALTER与DROP三个所组成。DDL并不涉及表内部数据的操作。
- 在某些上下文中,该术语也称为数据描述语言,因为它描述了数据库表中的字段何记录。
2. 建表语法
2.1 完整建表语法树
注意事项
- 蓝色字体是建表语法的关键字,用户指定某些功能。
- [ ] 中括号的语法表示可选。
- | 表示使用的时候,左右语法二选一。
- 建表语句中的语法顺序要和语法树中顺序保持一致
2.2 数据类型
Hive数据类型指的是表中列的字段类型
- 整体分为两类:原生数据类型和复杂数据类型。
- 原生数据类型包括:数据类型、时间日期类型、字符串类型、杂项数据类型。
- 复杂数据类型包括:array数据、map映射、struct结构、union联合体。
- 原生数据类型:
- 复杂数据类型:
注意事项
- HIive SQL中,数据类型英文字母大小写不敏感;
- 除SQL数据类型外,还支持Java数据类型,比如字符串string;
- 复杂数据类型的使用通常需要和分隔符指定语法配合使用;
- 如果定义的数据类型和文件不一致,Hive会尝试隐式转换,但不保证成功。
隐式转换
- 与标准SQL类似,HQL支持隐式和显示类型转换。
- 原生类型从窄类型到宽类型的转换成为隐式转换,反之,则不允许。
- 下表描述了类型之间允许的隐式转换:
显示转换
- 显示转换使用CAST函数。
例如,CAST (‘100’ as INT) 会将100字符串转换为100整数值。
如果强制转换失败,例如CAST (’Allen’ as INT) ,该函数返回NULL。
3. 案例练习
3.1 原生数据类型使用
目标要求:
- 文件archer.txt记录手游《王者荣耀》射手的相关信息,包括生命、物防、物攻等属性信息,其中字段之间分隔符额为制表符\t,要求Hive中建表映射成功该文件。
分析思路:
实现过程及结果: - 创建数据库并切换使用:
create database if not exists kox01;
use kox01;
- 创建表:
create table t_archer(
id int comment "ID",
name string comment "英雄名称",
hp_max int comment "最大生命",
mp_max int comment "最大法力",
attack_max int comment "最高物攻",
defense_max int comment "最大物防",
attack_range string comment "攻击范围",
role_main string comment "主要定位",
role_assist string comment "次要定位"
) comment "王者荣耀射手信息"
row format delimited
fields terminated by "\t";
验证是否创建成功
- 将文件上传到对应表文件夹下:
mkdir hivedata
cd hivedata/
- 上传archer.txt:pass
- 将文件上传到HDFS表所对应的目录下:
hadoop fs -put archer.txt /user/hive/warehouse/kox01.db/t_archer
验证查询是否成功
3.2 复杂数据类型使用
目标要求:
- 文件hot_hero_skin_price.txt中记录了手游《王者荣耀》热门英雄的相关皮肤价格信息,要求在Hive中建表映射成功该文件。
实现过程及结果
- 创建表:
create table t_hot_hero_skin_price(
id int,
name string,
win_rate int,
skin_price map<string,int> -- 复杂类型
) row format delimited
fields terminated by ',' -- 指定字段之间分隔符
collection items terminated by '-' -- 指定集合元素之间的分隔符
map keys terminated by ':'; -- 指定map元素kv之间的分隔符
验证是否创建成功
- 将文件上传到对应表文件夹下:
- 将文件上传到HDFS表所对应的目录下:
hadoop fs -put hot_hero_skin_price.txt /user/hive/warehouse/kox01.db/t_hot_hero_skin_price
验证查询是否成功
3.3 默认分隔符使用
目标任务:
- 文件team_ace_player.txt中记录了手游《王者荣耀》主要战队内最受欢迎的王牌选手信息,字段之间使用的是\001作为分隔符,要求在Hive中建表
实现过程及结果: - 创建表:
create table t_team_ace_player(
id int,
team_name string,
ace_player_name string
); --没有指定row format语句 此时采用的是默认的\001作为字段的分割符
验证是否创建成功
- 将文件上传到对应表文件夹下:
- 将文件上传到HDFS表所对应的目录下:
hadoop fs -put team_ace_player.txt /user/hive/warehouse/kox01.db/t_team_ace_player
验证查询是否成功
3.4 指定数据存储路径
任务目标:
- 文件team_ace_player.txt中记录了手游《王者荣耀》主要战队内最受欢迎的王牌选手信息,字段之间使用的是\001作为分隔符。
要求把文件上传到HDFS任意路径下,不能移动复制,并在Hive中建表映射成功该文件。
实现过程及结果: - 在根目录创建文件夹:
hadoop fs -mkdir /data
- 上传文件:
hadoop fs -put team_ace_player.txt /data
- 创建表:
create table t_team_ace_player_location(
id int,
team_name string,
ace_player_name string
) location '/data'; -- 使用loacation关键字指代指定本张表数据在hdfs上的存储路径
验证查询是否成功