day56-Hive
day56-Hive
Hive
Hive数据类型
基本数据类型
| Hive数据类型 | Java数据类型 |
|---|---|
| tinyint | byte |
| smalint | short |
| int | int |
| bigint | long |
| boolean | boolean |
| float | float |
| double | double |
| string | string |
| timestamp | 时间类型 |
| binary | 字节数组 |
集合数据类型
| 数据类型 | 描述 |
|---|---|
| struct | 结构体,和c语言中的struct类似,都可以通过 点 符号访问元素内容 |
| map | map是一组键值对,使用数组表示法可以访问数据 |
| array | 数组是一组具有相同类型和名称的变量的集合。 |
实例

数据
数据的格式:,隔开了每个字段,_隔开了每个字段的多个值
songsong,bingbing_lili,xiao song:18_xiaoxiaosong:19,hui long guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
基于上述的数据结构创建表
create table person(
name string,
friends array<string>,
children map<string,int>,
address struct<street:string,city:string,id:int>
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
把数据上传到hdfs中
1. 通过hdfs上传
hdfs fs -put person.txt /user/hive/warehouse/person
2. 通过hive上传(beeline)
load data local inpath '/opt/module/hive-3.1.2/datas/person.txt' into table person;
类型转化
Hive的原子数据类型是可以进行隐式转换的,类似于Java的类型转换,例如某表达式使用Int类型,tinyint会自动转换为int类型,但是Hive不会进行反向转化,例如,某表达式使用tinyint类型,int不会自动转换为tinyint类型,他会返回错误,除非使用cast操作。
隐式类型转换
tinyint-->int-->bigint-->float-->double<--string
boolean类型不可以转换为任何其它的类型
可以使用cast操作显示进行数据类型转换
cast('1' as int) 转换成功返回被转换后的值, 转换失败返回值为null
DDL数据定义
建库语句
create database [if not exists] database_name -- 指定库名
[comment database_comment] -- 指定库的描述信息
[location hdfs_path] -- 指定库在hdfs中的对应目录
[with dbproperties (property_name=property_value,...)] -- 指定库的属性信息
建库操作
create da tabase if not exists mydb
comment 'this is my first db'
location '/mydb' -- 不指定就会放到默认的工作目录(配置文件中配置的位置)
with dbproperties('dbname'='mydb','createtime'='2022-5-15');
元数据解释
在Hive中创建的库或者表,在HDFS中都有一个对应的目录,库或者表与目录的映射关系维护到mysql中的表中。
建库或者建表的时候,可以通过location指定库和表在hdfs的映射目录。如果指定,则使用指定的目录。
如果不指定,库默认映射的目录为/user/hive/warehouse/库名.db
表默认映射的目录为 表所在的库映射的目录/表名
注意:hive不存储任何数据,数据都是存储在mysql中的。
mysql中的metastore
hdfs存储我们要分析的数据
hive的表要分析哪一部分数据,需要hive的表与hdfs的目录做一个映射关系,这个映射关系需要在mysql中维护,以及表的信息也在mysql中维护。
查询数据库
显示数据库
show databases;
过滤显示的数据库
show databases like 'db_hive*';
查看数据库详情
显示数据库信息
desc database db_hive;
显示数据库详细信息
desc database extended db_hive;
切换当前数据库
use db_hive;
修改数据库
用户可以使用alter database命令为某个数据库的dbproperties设置键-值对属性值,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。
- 修改
alter database db_hive set
dbproperties('createtime'='20220930');
# 查看结果
desc database extended db_hive;
删除数据库
- 删除空数据库
drop database db_hive;
- 删除非空的数据库
drop database db_hive cascade;
- hdfs
数据库被删除,在hdfs上对应的目录也会被删除,mysql的原数据也会被删除。
表的DDL
- 建表语句
create [external] table [if not exists] table_name -- 指定表的名字
-- external 表示外部表,不添加,则表示创建内部表(管理表)
[(col_name data_type [comment col_comment],...)] -- 指定列名、列类型、列的描述信息
[comment table_comment] -- 指定表的描述信息
[partitioned by (col_name data_type [comment col_comment],...)] -- 指定分区列名 列类型 列描述信息(分区是f)
[clustered by (col_name,col_name,...) -- 指定分桶列名,分桶是分数据
[sorted by (col_name [asc|desc],...)] into num_buckets buckets] -- 指定排序列(几乎不使用0),分多少个桶
[row format delimited fields terminated by 分隔符] -- 指定行分隔符
row format delimited fields terminated by ',' -- 指定每行数据中每个元素的分隔符
collection items terminated by '_' -- 指定集合的元素分隔符
map keys terminated by ':' -- 指定map的kv的分隔符
lines terminated by '\n'; -- 指定行分隔符
[stored as file_format] -- 指定表数据的存储格式(textfile,orc,parquet)
[location hdfs_path] -- 指定表对应的hdfs的目录
[tblproperties(property_name=property_value,...)] -- 指定表的属性信息
[as select_statement]
- 管理表
默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如:/user/hive/warehouse)所定义的目录的子目录下。当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。
管理表(内部表)
删除表时,会将表在HDFS中映射的目录和目录下的数据都删除
- 外部表
外部表:create external table table_name();
删除表时,只会删除mysql中元数据信息,不会删除表在HDFS中映射的目录和目录下的数据
- 外部表与内部表的转换
desc formatted 表名; 查看表的详细信息
alter table 表名 set tblproperties('EXTERNAL'='FALSE'); // 取消外部表
alter table 表名 set tblproperties('EXTERNAL'='TRUE'); // 设置外部表
注意:大小写

浙公网安备 33010602011771号