Hive 的SQL基本操作

1. select 的顺序要和 insert overwrite 表中的字段顺序保持一致 
2. 没有参数的函数可以不用写 (),例如 select current_timestamp;

官方文档查看

Home - Apache Hive - Apache Software Foundation

Hive 数据库操作

切换数据库

-- 切换为 myhive 数据库
use  myhive;

查看所有的数据库

-- 查看所有的数据库
show databases;

在这里插入图片描述

查看数据库的详细信息

-- 查看数据库 myhive 的详细信息
desc database myhive;

在这里插入图片描述

创建数据库

-- 创建一个名称为 myhive 的数据库
create database if not exists myhive;

在这里插入图片描述

数据库表的存放位置

hive 的表存放位置模式是由 hive-site.xml 中的一个属性指定的,该文件存放在 hdfs

<property>
	<name>hive.metastore.warehouse.dir</name>
  <value>/user/hive/warehouse</value>
</property>

创建数据库并指定 hdfs 存储位置

-- 创建一个名为 myhive2 的数据库,hdfs 的存放路径为 /myhive2
create database myhive2 location '/myhive2';

在这里插入图片描述

创建数据库并指定键值对信息

-- 创建一个名为 myhive 的数据库,并指定键值对信息
create database myhive with dbproperties ('owner'='kyle', 'date'='20190120');

查看数据库的详细信息

-- 查看数据库的键值对信息
describe database extended myhive;

-- 查看数据的更多详细信息(没什么区别)
desc database extended myhive;

在这里插入图片描述
在这里插入图片描述

修改数据库的键值对信息

alter database myhive set dbproperties ('owner'='harry');

删除数据库

-- 删除一个空数据库 myhive ,如果数据库下面有数据表,那么就会报错
drop database myhive;

-- 强制删除数据库 myhive ,包含数据库下面的表一起删除
drop database myhive cascade; 

Hive 数据库表操作

查看表的语法介绍

查看表的详细信息

-- 查看表的详细信息
show create table edu_dwd.visit_consult_dwd;

在这里插入图片描述

建表的语法介绍

创建表的语法

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
   [(col_name data_type [COMMENT col_comment], ...)] 
   [COMMENT table_comment] 
   [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
   [CLUSTERED BY (col_name, col_name, ...) 
   [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
   [ROW FORMAT row_format] 
   [STORED AS file_format] 
   [LOCATION hdfs_path]
-- 创建一个指定名字的表:如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常
CREATE TABLE 

-- 该关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据
EXTERNAL

-- 表示注释,默认不能使用中文
COMMENT

-- 表示使用分区,一个表可以拥有一个或者多个分区,每个分区单独存在一个目录下
PARTITIONED BY

-- 允许用户复制现有的表结构,但是不复制数据
LIKE

-- 可用来指定行分隔符,默认分隔符为 '^A' ,在八进制中为 '\001'
ROW FORMAT DELIMITED 

-- 来指定该表数据的存储格式,hive 中,表的默认存储格式为 TextFile
STORED AS  SEQUENCEFILE | TEXTFILE | RCFILE | orc | PARQUET

-- 对于每一个表(table)进行分桶(MapReuce中的分区),桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中
CLUSTERED BY

-- 指定表在 HDFS 上的存储路径
LOCATION

-- 指定压缩算法
tblproperties ('orc.compress'='SNAPPY')

Hive 建表的字段类型

分类 类型 描述 字面量示例
原始类型 BOOLEAN true/false TRUE
TINYINT 1字节的有符号整数 -128~127 1Y
SMALLINT 2个字节的有符号整数,-32768~32767 1S
INT 4个字节的带符号整数 1
BIGINT 8字节带符号整数 1L
FLOAT 字节单精度浮点数1.0
DOUBLE 8字节双精度浮点数 1.0
DEICIMAL 任意精度的带符号小数 1.0
STRING 字符串,变长 “a”,’b’
VARCHAR 变长字符串 “a”,’b’
CHAR 固定长度字符串 “a”,’b’
BINARY 字节数组 无法表示
TIMESTAMP 时间戳,毫秒值精度 122327493795
DATE 日期 ‘2016-03-29’
INTERVAL 时间频率间隔
复杂类型 ARRAY 有序的的同类型的集合 array(1,2)
MAP key-value,key必须为原始类型,value可以任意类型 map(‘a’,1,’b’,2)
STRUCT 字段集合,类型可以不同 struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0)
UNION 在有限取值范围内的一个值 create_union(1,’a’,63)

根据查询结果建表

当我们通过 SELECT 查询得到结果,可以很快捷的直接把查询结果作为表的数据进行建表


视图的操作

什么是视图

视图仅仅是存储在数据库中具有关联名称的查询语言的语句,它是以预定义的 SQL 查询形式的表的组合

视图可以包含表的所有行或选定的行

创建视图

-- 创建员工表
CREATE TABLE EMPLOYEE (ID INT, NAME STRING, AGE INT,ADDRESS STRING, SALARY BIGINT);

-- 创建一个视图:用户只能查看 NAME 和 AGE 字段的数据
CREATE VIEW IF NOT EXISTS EMPLOYEE_VIEW AS SELECT NAME,AGE FROM EMPLOYEE;

-- 此时查看 EMPLOYEE 表的数据则只展示 NAME 和 AGE 字段
SELECT * FROM EMPLOYEE;

修改视图

ALTER VIEW EMPLOYEE_VIEW AS SELECT NAME FROM EMPLOYEE; 

删除视图

DROP VIEW EMPLOYEE_VIEW;

内部表的操作

内部表说明

未被 external 修饰的是内部表( 管理表 managed table ),内部表又称管理表,内部表数据存储的位置由 hive.metastore.warehouse.dir 参数决定(默认:/user/hive/warehouse ),删除内部表会直接删除元数据(metadata)及存储数据,因此内部表不适合和其他工具共享数据

创建一张简单的内部表

-- 使用 myhive 数据库
use myhive;

-- 创建 stu 表
create table stu(id int,name string);

-- 插入数据
insert into stu values (1,"zhangsan");

-- 查询数据
select * from stu;

在这里插入图片描述
在这里插入图片描述
创建表并指定字段之间的分隔符

create table if not exists stu2
(
    id   int,
    name string
) row format delimited fields terminated by '\t' stored as textfile location '/user/stu2';

在这里插入图片描述
根据查询结果创建表

create table stu3 as
select *
from stu2;

根据已经存在的表创建表

create table stu4 like stu2;

查询表的类型

desc formatted stu2;

在这里插入图片描述

删除表(会将 HDFS 的内容也删除)

-- 查看数据库和 HDFS,发现删除内部表之后,所有的内容全部删除
drop table stu2;

外部表的操作

外部表说明

在创建表的时候可以指定 external 关键字创建外部表,外部表对应的文件存储在 location 指定的 hdfs 目录下,向该目录添加新文件的同时,该表也会读取到该文件(当然文件格式必须跟表定义的一致)

外部表因为是指定其他的 hdfs 路径的数据加载到表当中来,所以 hive 表会认为自己不完全独占这份数据,所以删除 hive 外部表的时候,数据仍然存放在 hdfs 当中,不会删掉

数据装载 Load 说明

-- 语法
load data [local] inpath '/opt/software/datas/student.txt' overwrite | into table student [partition (partcol1=val1,)];
-- 参数说明
-- 加载数据
load data

-- 从本地加载数据到 hive 表;否则从 HDFS 加载数据到 hive 表
local

-- 表示加载数据的路径
inpath

-- 表示覆盖表中已有数据,否则表示追加
overwrite

-- 表示加载到哪张表
into table

-- 表示具体的表
student

-- 表示上传到指定分区
partition

数据说明

# student.txt
01 Jackson 1990-01-01 男 
02 Harry 1990-12-21 男 
03 Ben 1990-05-20 男 
04 Jack 1990-08-06 男
05 Rose 1991-12-01 女 
06 Lisa 1992-03-01 女 
07 Lucy 1989-07-01 女 
08 Jim 1990-01-20 女 

# teacher.txt
01 Soul 
02 Alan 
03 Kyle 

创建简单的外部表

注意:如果删掉 student 表,hdfs 的数据仍然存在,并且重新创建表之后,表中就直接存在数据了,因为我们的 student 表使用的是外部表,drop table 之后,表当中的数据依然保留在 hdfs 上面了

-- 创建教师表
create external table teacher (t_id string,t_name string) row format delimited fields terminated by '\t';

-- 创建学生表
create external table student (s_id string,s_name string,s_birth string , s_sex string ) row format delimited fields terminated by '\t';

在这里插入图片描述

从本地文件系统向表中加载数据

load data local inpath '/opt/software/student.txt' into table student;

在这里插入图片描述

从本地文件系统中加载并覆盖已有数据

load data local inpath '/opt/software/student.txt' overwrite into table student;

从 Hdfs 文件系统中向表中加载数据

-- 需要提前将数据添加到这个路径
load data inpath '/test/teacher.txt' into table teacher;

在这里插入图片描述

复杂类型表的操作

① Array 类型

数据说明

# name 与 locations 之间制表符分隔,locations 中元素之间逗号分隔
Kyle		beijing,shanghai,tianjin,hangzhou
Jack		changchun,chengdu,wuhan,beijin

建表语句

create table user_address(name string, work_locations array<string>)
row format delimited fields terminated by '\t'
COLLECTION ITEMS TERMINATED BY ',';

导入数据(从本地导入,同样支持从 HDFS 导入)

load data local inpath '/opt/software/work_locations.txt' overwrite into table user_address;

在这里插入图片描述

常用查询

-- 查询所有数据
select * from user_address;

-- 查询 loction 数组中第一个元素
select name, work_locations[0] location from user_address;

-- 查询 location 数组中元素的个数
select name, size(work_locations) location from user_address;

-- 查询 location 数组中包含 tianjin 的信息
select * from user_address where array_contains(work_locations,'tianjin'); 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

② map 类型

数据说明

# 字段与字段分隔符: “,”;需要 map 字段之间的分隔符:"#";map内部k-v分隔符:":"

1,Jack,father:Ulrica#mother:Quella#brother:Lilith,28
2,Lucy,father:Gary#mother:Jseph#brother:James,22
3,Kyle,father:Mark#mother:Martin#sister:Mark,29
4,Jim,father:Coco#mother:Charles,26

建表语句

create table user_info(
id int, name string, members map<string,string>, age int
)
row format delimited
fields terminated by ','
COLLECTION ITEMS TERMINATED BY '#' 
MAP 
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值