Hive语法总结

本文深入探讨了Hive SQL的高级特性,包括建表语法、数据装载、分区优化、分桶表策略及视图应用。详述了CTAS、CTE、LIKE等建表技巧,以及静态和动态分区的实现方法,强调了分桶表和视图在提升查询性能和简化复杂查询中的作用。
摘要由CSDN通过智能技术生成

一、建表语句

建表语句:

# IF NOT EXISTS可选,如果表存在,则忽略
CREATE EXTERNAL TABLE IF NOT EXISTS employee_external (
	# 列出所有列和数据类型
    name string,
    work_place ARRAY<string>,
    sex_age STRUCT<sex:string,age:int>,
    skills_score MAP<string,int>,
    depart_title MAP<STRING,ARRAY<STRING>>
)
COMMENT 'This is an external table'
# 如何分隔列(字段
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
# 如何分隔集合和映射
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
# 文件存储格式
STORED AS TEXTFILE
# 数据存储路径(HDFS)
LOCATION '/home/hadoop/hive/warehouse/employee'; 

创建内部表只需把external去掉即可

查看你表的详细信息:desc formatted employee_external ;

内部表和外部表的区别:
在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
外部表external:建表时需要加上location,指向数据存放的位置如/data/test/student/,如果hdfs上没有此目录,创建表时他会在hdfs上自动创建目录结构,添加数据有两种方式:
- 方式一:通过load方法直接将文件映射到location的目录下
- 方式二:shell命令,通过hdfs dfs -put来将数据文件放入到location的hdfs的目录中
内部表:建表时一般不需要加location,它会默认在hdfs的houseware目录下自动创建目录存放数据,结构是这样的:.../houseware/数据库名.db/创建的数据表名/存放数据表的数据,导入数据是和外部表的相同

二、Hive建表高阶语句-CTAS and WITH

1.CTAS

用此方法创建的只能是内部表

CREATE TABLE ctas_employee as SELECT * FROM employee;

注意:CTAS不能创建partition, external, bucket table

2.CTS
CREATE TABLE cte_employee AS
WITH 
r1 AS  (SELECT name FROM r2 WHERE name = 'Michael'),
r2 AS  (SELECT name FROM employee WHERE sex_age.sex= 'Male'),
r3 AS  (SELECT name FROM employee  WHERE sex_age.sex= 'Female')
SELECT * FROM r1 UNION ALL SELECT * FROM r3;
3.like-只创建表结构
create table student3 like student;
select * from student3;
+----------------+------------------+-------------------+-----------------+--+
| student3.s_id  | student3.s_name  | student3.s_birth  | student3.s_sex  |
+----------------+------------------+-------------------+-----------------+--+
+----------------+------------------+-------------------+-----------------+--+

三、表操作

1.删除表
-- 删除表
drop table if exists employee;
-- 清空表数据
truncate table employee;
2.修改表结构(Alter)
-- 修改表名, 常用于数据备份
ALTER TABLE employee RENAME TO new_employee;
ALTER TABLE c_employee SET TBLPROPERTIES ('comment'='New name, comments');
ALTER TABLE employee_internal SET SERDEPROPERTIES ('field.delim' = '$');
ALTER TABLE c_employee SET FILEFORMAT RCFILE; -- 修正表文件格式
-- 修改表的列操作
ALTER TABLE employee_internal CHANGE 老的列名字 新的列名字 STRING; -- 修改列名
ALTER TABLE c_employee ADD COLUMNS (work string); -- 添加列
ALTER TABLE c_employee REPLACE COLUMNS (name string); -- 替换列

三、装载数据:load

语法:

load data [local] inpath '/opt/datas/student.txt' [overwrite] into table 
student [partition (partcol1=val1,)];

LOAD用于在Hive中移动数据

有OVERWRITE:覆盖原有的数据
无OVERWRITE:追加到原来的表

1.加local关键字,原始文件位于Linux本地,执行后为拷贝数据
LOAD DATA LOCAL INPATH '/data/mytest/employee.txt' OVERWRITE INTO TABLE employee;
2.没有local关键字,表示文件位于hdfs上执行后为直接移动数据

将hdfs上的数据一道hive表中的分区中

LOAD DATA INPATH '/tmp/employee.txt'  OVERWRITE INTO TABLE employee_partitioned PARTITION (year=2017, month=12);

四、Hive分区(重点!!!!!)

分区主要用于提高性能

  • 分区列的值将表划分为一个个的文件夹
  • 查询时语法使用"分区"列和常规列类似
  • 查询时Hive会只从指定分区查询数据,提高查询效率

分为静态分区和动态分区
静态分区与动态分区的主要区别:在于静态分区是手动指定,而动态分区是通过数据来进行判断

1.建表

动态分区建表语句和静态分区相同

# 建一个分区表
CREATE TABLE IF NOT EXISTS employee_partitioned (
    name string,
    work_place ARRAY<string>,
    sex_age STRUCT<sex:string,age:int>,
)
# 以year,month分区
partitioned by (year int,month int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
STORED AS TEXTFILE
; 

# 建一个数据源表employee_hr
CREATE TABLE IF NOT EXISTS employee_hr (
name string,
employee_id int,
number string,
start_data string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
STORED AS TEXTFILE
; 
# 导入数据到employee_hr表中
load data local inpath '/data/big_data_training-master/data/employee_hr.txt' into table employee_hr;


2.静态分区

需要手动创建分区

# 手动添加分区
alter talbe employee_partitioned add
partition (year=2019,month=7)
partition (year=2020,month=7)
partition (year=2020,month=8)
;

# 数据导入静态分区的两种方式
# 方式一:外部文件导入,入csv文件
load data local inpath '/data/emp/employee.txt' into table employee_partitioned partition (year=2020,month=7);
# 方式二:通过查询插入静态分区的指定分区中
insert into employee_partitioned partition (year=2019,month=7)
select name,employee_id,number,year(start_data),month(start_data) from employee_hr
3.动态分区

需要开启动态分区

# 开启动态分区
set hive.exec.dynamic.partition=true;
# 开启非严格模式,严格模式需要指定分区
set hive.exec.dynamic.partition.mode=nonstrict;

insert方式添加动态分区数据

# 字段一定要对齐
insert into employee_partitioned partition (year,month)
select name,enployee_id,number,year(start_data),month(start_data) from employee_hr
4.删除分区

删除单个分区

 alter table dept_partition drop partition (month='201904');

删除多个分区

# 删除多个分区有逗号,添加多个分区没有逗号
alter table dept_partition drop partition (month='201905'), 
partition (month='201906');
5.查看分区数
show partitions dept_partition;
6.查看分区表结构
desc formatted dept_partition;

五、分桶表

Hive:按照分桶字段(列)的 hash 值除以分桶的个数进行取余(bucket_id = column.hashcode % bucket.num)。

1.设置Hive的分桶开关
# 手动开启分桶
set hive.enforce.bucketing=true;
2.创建分桶表
create table test_bucket(
id int,
name string,
age int
)
# 由age字段来分桶,分4个桶
clustered by (age) into 4 buckets
row format delimited
fields terminated by '';
3.将查询的数据插入到分桶表中
insert into test_bucket
select id,name,age from people;
4.查看hdfs中的目录

在这里插入图片描述

每个分桶对应一个文件

六、视图(View)

1.视图概念
  • 通过隐藏子查询、连接和函数来简化查询的逻辑结构
  • 只保存定义,不存储数据
  • 如果删除或更改基础表,则查询视图将失败
  • 视图是只读的,不能插入或装载数据
2.应用场景
  • 将特定的列提供给用户,保护数据隐私
  • 用于查询语句复杂的场景
3.视图操作

视图操作命令:CREATE、SHOW、DROP、ALTER

-- 创建视图,支持 CTE, ORDER BY, LIMIT, JOIN,等
CREATE VIEW view_name AS SELECT statement; 
-- 查找视图 (SHOW VIEWS 在 hive v2.2.0之后)
SHOW TABLES; 
-- 查看视图定义
SHOW CREATE TABLE view_name; 
-- 删除视图
DROP view_name; 
--更改视图属性
ALTER VIEW view_name SET TBLPROPERTIES ('comment' = 'This is a view');
-- 更改视图定义,
ALTER VIEW view_name AS SELECT statement; 
4.侧视图(Lateral View) 了解即可
select name,work_place,loc from employee lateral view outer explode(split(null,',')) a as loc;

支持多层级

select name,wps,skill,score from employee 
lateral view explode(work_place) work_place_single as wps
lateral view explode(skills_score) sks as skill,score;
-- skills_score以map键值对形式保存数据,skill是key,score是value
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值