一、数据字段类型
数据类型 :LanguageManual Types - Apache Hive - Apache Software Foundation
基本数据类型
数值相关类型
整数
tinyint
smallint
int
bigint
小数
float
double
decimal 精度最高
日期类型
date 日期
timestamps 日期时间
字符串类型
string
varchar
char
布尔类型
BOOLEAN 表示真假 只能存储0或1
复杂类型
array 数组类型
[1,2,3]
['a','b','c']
map
{key:value}
-- hive中的数据类型演示 use itcast; -- 创建表 create table tb_test( id tinyint comment 'id值', age smallint comment '年龄', phone int comment '手机号', name varchar(20), gender string, weight decimal(10,2), create_time timestamp, hobby array<string> comment '兴趣爱好', -- [数据1] arrary<数组中的数据类型> hero map<string,int> comment '游戏英雄' -- {key:value} 指定key值类型,指定value值类型 )comment '数据类型测试表'; -- 写入数据进行类型测试 insert into tb_test values(1,20,13711111111,'张三','男',180.21,'2020-10-01 10:10:10',array('篮球','足球'),map('关羽',80,'小乔',60)); insert into tb_test values(2000,20,13711111111,'张三','男',1800.21,'2020-10-01 10:10:10',array('篮球','足球'),map('关羽',80,'小乔',60)); select * from tb_test; select hobby[1] from tb_test; select hero['关羽'] from tb_test;
二、分隔符指定
对hdfs上的文件数据存储时的分割符进行指定
hive在将行数据存储在hdfs上时,默认字段之间的数据分隔符 \001
在创建表时可以指定分割符
row format delimited fields terminated by '分割符'
create table tb_row_field ( id int, name string, age int, gender string ) row format delimited fields terminated by ','; -- 指定分隔符 固定格式 insert into tb_row_field values(1,'aa',20,'男');
三、表的修改
名字修改,字段名修改,字段类型修改
alter 关键字
alter table 表名 rename to 新的表名 alter table 表名 add columns(字段名 字段类型) alter table 表名 change 旧字段名 新字段 字段类型 alter table 表名 set 属性设置
-- 表的修改修改操作 create table tb_ddl( id int, name string, age int, gender string ); desc formatted tb_ddl2; -- 修改表名 alter table tb_ddl rename to tb_ddl2; -- 增加字段 alter table tb_ddl2 add columns(phone string); -- 修改字段 alter table tb_ddl2 change id id bigint; desc tb_ddl2; -- 修改字段类型是,只能将小字节的类型修改为大字节的类型 -- alter table tb_ddl2 change id id int; -- 修改表属性 alter table tb_ddl2 set tblproperties('age12'='20'); desc formatted tb_ddl2; -- hdfs://node1:8020/user/hive/warehouse/itcast.db/tb_ddl2 alter table tb_ddl2 set location 'hdfs://node1:8020/tb_ddl2'; desc formatted tb_ddl2; insert into tb_ddl2 values(1,'aa',20,'ccc','123123123'); alter table tb_ddl2 add columns(create_time date comment '创建时间',price decimal(10,2)); desc tb_ddl2; alter table tb_ddl2 change age age1 string after phone; desc tb_ddl2; alter table tb_ddl2 change age1 age double after id; desc tb_ddl2;
四、表的删除
-- 表删除 会删除表的目录和表的元数据信息 drop table tb_ddl2; select * from tb_ddl2; -- 表清空数据 把存储数据的文件一并删除 select * from tb_row_field; truncate table tb_row_field;
五、表的分类
内部表 Managed Tabel
外部表 External Tables
区别:
在删除表时,
内部表会把表的所有数据删除(元数据和行数据)
外部表会把表的元数据删除,保留hdfs上的文件数据
默认创建的表都是内部表
创建外部表需要使用关键字External
create external table 表名( 字段 字段类型 )
-- 创建内部表 create table tb_managed( id int, name string ); -- 创建外部表 create external table tb_external( id int, name string ); desc formatted tb_managed; desc formatted tb_external; drop table tb_managed; drop table tb_external;
-- 修改表的类型 desc formatted tb_managed; alter table tb_managed set tblproperties('EXTERNAL'='TRUE'); -- 设置为外部表 alter table tb_managed set tblproperties('EXTERNAL'='FALSE');-- 设置为内部表
六、表数据写入
在对表数据写入时有两张方式
方式一 直接将数据文件上传到指定的表目录下
方式二 通过insert将数据写入的表目录的文件中
6-1 方式一 将数据文件上传到对应的表目录下
可以使用hdfs上传
可以使用hivesql的load语句上传
hive运行的位置就文件上传的位置
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] -- filepath 指定本地服务器的数据文件位置 ,本地指的是hive运行的服务器
-- 使用load语句将文件数据上传表中 -- file:// 是本地文件的路径协议,是一个固定写法 load data local inpath 'file:///root/order5.txt' into table tb_order; -- 覆盖上传文件 load data local inpath 'file:///root/order5.txt' overwrite into table tb_order;
6-2 方式2 使用insert指定数据导入
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement; INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
insert into tb_order values (1,123.23,5,'北京'); insert overwrite table tb_order values (2,123.23,5,'上海'); -- 写入数据是在values中指定 -- 也可以将一个select 查询结果写到表中 create table tb_order_new( id int, total_price decimal(10,2), total_number int, address string )row format delimited fields terminated by ','; insert into tb_order_new select * from tb_order; -- 通过该方式可以实现计算结果的保存 create table tb_result( cnt int comment '总数' ); insert into tb_result select count(*) from tb_order; select * from tb_result;
6-3 将表数据导出到服务器
insert overwrite local directory 'file:///root/data' row format delimited fields terminated by ',' select * from tb_order;
七、表的分区
在公司会产生大量数据,数据存储在hdfs上时,需要对数据进行拆分,在进行数据查询时就可以快速查询到需要的内容
如果需要进行数据的分区操作,就需要再建表的时候指定分区字段
-- 创建分区表 create table tb_user_partiton( id int, name string, age int, create_time date )partitioned by(gender int) row format delimited fields terminated by ','; -- 静态分区数据写入 -- 手动指定分区数据 insert into tb_user_partiton partition(gender=0) values(1,'张三',20,'2024-10-10 14:21:21'); -- 动态分区数据写入,可以根据select中指定的字段数据最为分区的依据 -- 需要进行设置开启 set hive.exec.dynamic.partition.mode=nonstrict; insert into tb_user_partiton partition(gender) select id,name,age,create_time,gender from tb_user; -- 多层分区 create table tb_user_partiton_many( id int, name string, age int, gender int, create_time date )partitioned by (y string,m string,d string) row format delimited fields terminated by ','; insert into tb_user_partiton_many partition(y,m,d) select id,name,age,gender,create_time,year(create_time),month(create_time),day(create_time) from tb_user limit 100; select * from tb_user_partiton_many where y=2015 and m=10;