这篇文章给大家分享的是有关Hive中有哪些数据类型的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
1、Hive 数据类型
1.1、基本数据类型

对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多
少个字符,理论上它可以存储2GB的字符数。
1.2 、集合数据类型

Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的
Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。
案例实操:
//1、假设某表有如下一行,我们用JSON格式来表示其数据结构。在Hive下访问的格式为
{
"name": "kinglong",
"friends": ["ZYL" , "WJM"], //列表Array,
"children": { //键值Map,
"xiao chen": 2,
"xiaoxiao chen": 1
}
"address": { //结构Struct,
"street": "wan guo cheng",
"city": "chang sha",
"email": "kinglong2333@163.com"
}
}
//2、基于上述数据结构,我们在Hive里创建对应的表,并导入数据。
创建本地测试文件test.txt
kinglong,ZYL_WJM,xiao chen:2_xiaoxiao chen:1,wan guo cheng_chang sha_kinglong2333@163.com
wujiaoxin,LWH_WQ,xiao wu:3_xiaoxiao wu:2,kai fu_changsha_233333@163.com
注意:MAP,STRUCT和ARRAY里的元素间关系都可以用同一个字符表示,这里用“_”。
//3、Hive上创建测试表test
create table test(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string,city:string,email:int>
)
row format delimited fields terminated by ',' -- 指定各字段之间用什么分隔开
collection items terminated by '_' --集合数据类型每条数据之间用什么分隔开
map keys terminated by ':' -- map数据类型k,v之间用什么分隔开
lines terminated by '\n'; -- 每条数据之间用什么分隔开(默认就是换行符)
//4、导入文本数据到测试表
hive (default)> load data local inpath '/opt/module/hive/datas/test.txt' into table test;
//5、访问三种集合列里的数据,以下分别是ARRAY,MAP,STRUCT的访问方式
hive (default)> select friends[1],children['xiao chen'],address.city from test
where name="kinglong";
OK
_c0 _c1 city
WJM 2 chang sha
Time taken: 0.076 seconds, Fetched: 1 row(s)
1.3、类型转换
Hive的原子数据类型是可以进行隐式转换的,类似于Java的类型转换,例如某表达式使用INT类型,TINYINT会自
动转换为INT类型,但是Hive不会进行反向转化,例如某表达式使用TINYINT类型,INT不会自动转换为TINYINT类型,
它会返回错误,除非使用CAST操作。
1)隐式类型转换规则如下
(1)任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。
(2)所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。
(3)TINYINT、SMALLINT、INT都可以转换为FLOAT。
(4)BOOLEAN类型不可以转换为任何其它的类型。
2)可以使用CAST操作显示进行数据类型转换
例如CAST('1' AS INT)将把字符串'1' 转换成整数1;如果强制类型转换失败,如执行CAST('X' AS INT),表达式返
回空值 NULL。

2、DDL数据定义
2.1、库的操作
一.创建库:
CREATE DATABASE [IF NOT EXISTS] 库名
#IF NOT EXISTS :如果库不存在则创建库。如果库存在则不创建。
#注意:如果不加该内容。库存在时就会报错
[COMMENT 库的描述信息]
#comment用来添加库的描述信息
[LOCATION hdfs_path]
#localtion : 指定库在hdfs上的路径(如果不指定则放在默认的路径下-配置文件中配置的路径)
[WITH DBPROPERTIES (name=value, ...)];
#WITH DBPROPERTIES : 给库添加属性。
#注意:name和value都是string
二.案例:
create database if not exists db2
comment 'this is db2'
location '/db2.db'
with dbproperties('version'='1.0');
三.对库的操作
1.查看所有的库:
show databases;
2.选库
use 库名;
3.查看库的信息(extended:可以查看库的属性内容)
desc database [extended] 库名;
4.修改库(只能修改属性)
alter database 库名 set dbproperties('name'='value');
5.删库(cascade :如果库为非空必须使用该字段才能删库)
#if exists :如果库存在则删除。如果不加该字段库不存在则会报错
drop database [if exists] 库名 [cascade]
2.2、表的操作
一 创建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] 表名
#EXTERNAL :加上该字段该表为外部表。不加则为内部表(管理表)
#IF NOT EXISTS :如果表不存在则创建表存在则不创建。如果不加该字段表存在则报错
[(字段名 字段类型 [COMMENT 字段的描述信息], ...)]
[COMMENT 表的描述信息]
[PARTITIONED BY (字段名 字段类型 [COMMENT 字段描述信息], ...)]
#PARTITIONED BY :指定分区字段(分区表)
[CLUSTERED BY (字段名1, 字段名2, ...)
#CLUSTERED BY :指定分桶字段(分桶表)
[SORTED BY (字段名 [ASC|DESC], ...)] INTO 分桶的数量 BUCKETS]
#SORTED BY :在添加数据时按照指定字段进行排序(几乎不用)
[ROW FORMAT row_format]
delimited fields terminated by ',' #指定各字段之间用什么分隔开
collection items terminated by '_' #集合数据类型每条数据之间用什么分隔开
map keys terminated by ':' #map数据类型k,v之间用什么分隔开
lines terminated by '\n';#每条数据之间用什么分隔开(默认就是换行符)
[STORED AS 存储的类型]
#STORED AS:指定存储文件(表中的数据)的类型。默认是TextFile
[LOCATION 表的路径]
[TBLPROPERTIES (name=value, ...)]
#给表添加属性。注意:name和value都是string
[AS sql查询语句]
#将查询的结果创建成一张表
[LIKE 表名]
#允许用户复制现有的表(like后面的表)结构,但是不复制数据
二 创建表案例
create table if not exists person(
id int comment 'this is id',
name string comment 'this is name'
)
comment 'this is person'
row format delimited fields terminated by '\t'
location '/person'
tblproperties('version'='1.0');
-----------------------------------------------------
2.1导入数据
load data [local] inpath '/opt/module/hive/datas/student.txt' into table person;
#[local] :如果不加local地址为HDFS。如果加了Local地址为本地
-----------------------------------------------------
2.2 like
create table if not exists person2
like person;
-----------------------------------------------------
2.3 as
create table if not exists person3
as
select * from person where id < 1010;
-----------------------------------------------------
2.4创建外部表和管理表
create external table if not exists ext_tbl(
id int,
name string
)
row format delimited fields terminated by '\t';
create table if not exists man_tbl(
id int,
name string
)
row format delimited fields terminated by '\t';
注意:外部表删除表时只会删除元数据。管理表删除表时会元数据和数据会被一同删除。
-----------------------------------------------------
2.5 外部表和管理表相互转换
alter table 表名 set tblproperties('EXTERNAL'='TRUE/FALSE');
注意:属性的内容一定要大写。
三 操作表:
1.查看表信息(formatted :可以查看更详细的内容)
desc [formatted] 表名;
2.删除表
drop table 表名;
3.修改表的名字
alter table 表名 rename to 新表名;
4.更新列名
ALTER TABLE 表名 CHANGE [COLUMN]
旧列名 新列名 列的类型 [COMMENT 列的描述信息] [FIRST|AFTER 列名]
4.更新列的类型
ALTER TABLE 表名 CHANGE [COLUMN]
列名 列名 新的列的类型 [COMMENT 列的描述信息] [FIRST|AFTER 列名]
注意:修改类型一定要符合隐式转换否则会报错。
5.增加列
ALTER TABLE 表名 ADD COLUMNS (字段名 字段类型 [COMMENT 字段描述信息], ...)
6.替换列
ALTER TABLE 表名 REPLACE COLUMNS (字段名 字段类型 [COMMENT 字段描述信息], ...)
注意:①如果替换的列少于被替换的列,那么按照顺序进行替换。没有被替换的列被直接删除。
②替换列时一定要注意数据类型。(能隐式转换的可以替换否则报错)
7、清空表(只能清空管理表--不是删表而是删除数据)
truncate table 表名;
感谢各位的阅读!关于“Hive中有哪些数据类型”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!