Hive基础(二)
Hive基础(二)
你我皆温柔HiveSQL基础
创建表
1
2
3
4
5
6create [external] table [if not exists] test(
id int [comment 'id primary key']
name
)
[row format delimited,
fields terminated by '指定分隔符'];添加external,则创建的是外部表
内部表(MANAGED_TABLE):默认创建内部表,托管表,管理表
- 分区表
- 分桶表
- 删除内部表时,会删除数据本身和元数据信息
外部表(EXTERNAL_TABLE):关联表,需要搭配location
- 分区表
- 分桶表
- 数据不是hive拥有和管理的,而只管理元数据生命周期,可以访问实际数据
区别
- 内部表适合数据临时处理转换等操作,及对数据进行清洗、统计分析、计算等
- 外部表适用于数据的长期存储、备份和共享
- Hive对内部表有绝对控制权
- 删除内部表时,会从Metastore中删除表元数据,还会从HDFS中删除其所有数据和文件
- 删除外部表时,只会从MetaStore中删除表的元数据,并保持HDFS位置中的实际数据不变
实操
1
2
3
4
5
6
7
8
9
10
11
12
13create external table test_hivedb1(
id int,
name string
)
row format delimited
fields terminated by ',';
-- 查看
describe formatted test_hivedb1;
-- 快速创建 -copy
create table tb_computer_copy as select * from tb_computer;
create table tb_phone_copy like tb_phone;数据类型
- 原生数据类型
- int
- float
- double
- char
- varchar
- string
- timestamp
- data
- 复杂类型
- array
- map
- strcut
- union
- 原生数据类型
删除表
1
2
3
4
5
61. 内部表:可以删除表和表数据
2. 外部表
drop table 表名;
-- 清空表数据
truncate table 表名;修改表
1
2
3
4
5
6
7
81、添加一列
alter table 表名 add columns(字段名 数据类型)
2、修改字段名
alter table 表名 change 原字段 新字段名 类型;
3、修改表名
alter table 表名 rename to 新表名
4、修改表位置路径
alter table 表名 set location '路径';操作表数据
1
2
3
4
5
6
7
8-- 插入表数据
insert into 表名 values(1,"lyt","woman");
-- 修改表数据(不支持修改)
Attempt to do update or delete using transaction manager that does not support these operations.
-- 查看表数据
select * from 表名;上传文件映射表:通过HDFS网页上传到对应目录
外部表操作
创建表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24-- 创建库
create database tb_test_stu;
-- 创建外部表
create external table outer_stu(
id int,
name string,
gender string
)
comment "external_stu_table"
row format delimited fields terminated by ","
location "/hello"
tblproperties ("create_time"="2023-08-30");
-- 查看创建表语句、
show create table outer_stu;
-- 设定路径、注释、属性
alter table outer_stu replace columns (字段名 类型,字段名 类型,...); --注意:所有的字段都要写
-- 修改表属性
alter table outer_stu set tblproperties (属性名=值,属性名=值,......);
alter table outer_stu set tblproperties ("create_time"="2023-09-01");
-- 查看
sleect * from outer_stu;
内部表与外部表转换
当仅临时使用数据时,使用外部表,建议使用内部表
不建议修改表的存储路径地址,因此修改表路径仅作了解
相互切换
修改表属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21alter table outer_stu set tblproperties("EXTERNAL"="TRUE") # TURE为外部表,FALSE为内部表
# external和true必须为大写
-- 实例
-- 创建内部表
create table inner_stu(
id int,
name string,
gender string
)
comment "external_stu_table"
row format delimited fields terminated by ","
location "/hello"
tblproperties ("create_time"="2023-08-30");
-- -- 查看table type
desc formatted inner_stu;
-- 切换
alter table inner_stu set tblproperties ("EXTERNAL"="TRUE");
alter table inner_stu set tblproperties ("EXTERNAL"="FALSE");
数据导入导出
- 数据导入
- HDFS页面导入
- insert into
- 将已有数据的表导入数据到新表
- insert into [table] 表名新 select * from 已有表名;(追加数据)
- insert overwrite table 新表名 select * from 已有表名;(数据覆盖)
- hdfs dfs -put /本地路径 /HDFS中的路径 (复制上传)
- 使用load语法加载数据到HDFS(直接移动源文件)
- 数据导出
通过HDFS页面导出
使用==hdfs dfs -get 源文件路径 目标文件路径== 的方式导出
使用类SQL命令导出数据
insert overwrite [local] directory “存放文件路径” select 语句;
加local表示导出到Linux本地
1
2
3
4
5
61、导出时默认分隔符 \001 和 SOH
insert overwrite directory "存放文件路径" selext * from tb_test01;
2、指定\t分隔符导出到Linux
insert overwrite local directory "存放文件路径" row fromat delimited fields terminated by "\t" selext * from tb_test01;
3、使用\t分隔符导出到hdfs
insert overwrite directory "存放文件路径" row fromat delimited fields terminated by "\t" selext * from tb_test01;
shell命令导出
hive -e 执行语句 > 文件名
1
2进入hive命令行
执行语句要用" select * from tb_test01" 括起来
- 数据导入