Hive 高级操作(一)之数据类型(原子,array,map,struct,union)

Hive 高级操作(一)之数据类型(原子,array,map,struct,union)

1、原子数据类型

数据类型长度描述
TinyInt1 个字节的有符号整数-128~127
SmallInt2 个字节的有符号整数-32768~32767
Int4 个字节的有符号整数-2147483648~2147483647
BigInt8 个字节的有符号整数-9223372036854775808~9223372036854775807
Boolean布尔类型,true 或 falsetrue,false
Float单精度浮点数
Double双精度浮点数
String字符串
TimStamp时间戳,整数值支持 Unix TimeStamp,可以达到纳秒精度

(1)Hive 支持日期类型(老版本不支持),在 Hive 里日期一般都是用字符串来表示的,而常用的日期格式转化操作则是通过自定义函数进行操作,当然也可以直接指定为日期类型。
(2)Hive 是用 Java 开发的,Hive 里的基本数据类型和 java 的基本数据类型也是一一对应的,除了 String 类型。
(3)有符号的整数类型:TINYINT、SMALLINT、INT 和 BIGINT 分别等价于 Java 的 Byte、Short、Int 和 Long 原子类型,它们分别为 1 字节、2 字节、4 字节和 8 字节有符号整数。
(4)Hive 的浮点数据类型 FLOAT 和 DOUBLE,对应于 Java 的基本类型 Float 和 Double 类型。
(5)Hive 的 BOOLEAN 类型相当于 Java 的基本数据类型 Boolean。
(6)Hive 的 String 类型相当于数据库的 Varchar 类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储 2GB 的字符数。
在这里插入图片描述
在这里插入图片描述

2、复杂数据类型

(1)复杂数据类型包括数组(ARRAY)、映射(MAP)和结构体(STRUCT),具体如下所示:

类型描述举例
struct与 C/C++ 中的结构体类似,可通过“.”访问每个域的值,比如 struct{first String; last String},可通过 name.first 访问第一个成员。struct{‘John’, ‘Doe’}
map存储 key-value 对,可通过 [‘key’] 获取每个 key 的值,比如 ‘first’->‘John’ and ‘Doe’,可通过 name[‘last’] 获取 last name。map(‘first’, ‘John’, ‘last’, ‘Doe’)
array同种类型的数据集合,从 0 开始索引,比如 [‘John’, ‘Doe’],可通过 name[1] 获取值 “Doe”。array(“John”, “Doe”)

(2)说明:
ARRAY:ARRAY 类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问。比如有一个 ARRAY 类型的变量 fruits,它是由 [‘apple’,‘orange’,‘mango’] 组成,那么我们可以通过 fruits[1]来访问元素 orange,因为 ARRAY 类型的下标是从 0 开始的。

MAP:MAP 包含 key->value 键值对,可以通过 key 来访问元素。比如 ”userlist” 是一个 map 类型,其中 username 是 key,password 是 value;那 么 我 们 可 以 通 过 userlist[‘username’] 来得到这个用户对应的 password。

STRUCT:STRUCT 可以包含不同数据类型的元素。这些元素可以通过”点语法”的方式来得到所需要的元素,比如 user 是一个 STRUCT 类型,那么可以通过 user.address 得到这个用户的地址。

(3)示例:

CREATE TABLE student(
	name STRING,
	favors ARRAY<STRING>, 
	scores MAP<STRING, FLOAT>,
	address STRUCT<province:STRING, city:STRING, detail:STRING, zip:INT>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY ';'
MAP KEYS TERMINATED BY ':';

字段说明:
(1)字段 name 是基本类型,favors 是数组类型,可以保存很多爱好,scores 是映射类型,可以保存多个课程的成绩,address 是结构类型,可以存储住址信息。
(2)ROW FORMAT DELIMITED 是指明后面的关键词是列和元素分隔符的。
(3)FIELDS TERMINATED BY 是字段分隔符。
(4)COLLECTION ITEMS TERMINATED BY 是元素分隔符(Array 中的各元素、Struct 中的各元素、Map 中的 key-value 对之间)。
(5)MAP KEYS TERMINATED BY 是 Map 中 key 与 value 的分隔符。
(6)LINES TERMINATED BY 是行之间的分隔符。
(7)STORED AS TEXTFILE 指数据文件上传之后保存的格式。

总结:
在关系型数据库中,我们至少需要三张表来定义,包括学生基本表、爱好表、成绩表;但在 Hive 中通过一张表就可以搞定了。也就是说,复合数据类型把多表关系通过一张表就可以实现了。

3、示例演示

3.1、array

建表语句:

# 原子类型
create table person(name string,work_locations string)
row format delimited fields terminated by '\t';

# array类型
create table person(name string,work_locations array<string>)
row format delimited fields terminated by '\t'
collection items terminated by ',';

数据:

huangbo beijing,shanghai,tianjin,hangzhou
xuzheng changchu,chengdu,wuhan
wangbaoqiang dalian,shenyang,jilin

导入数据:

load data local inpath '/home/hadoop/person.txt' into table person;

查询语句:

select * from person;
select name from person;
select work_locations from person;
select work_locations[0] from person;

3.2、map

建表语句:

create table score(name string, scores map<string,int>)
row format delimited fields terminated by '\t'
collection items terminated by ','
map keys terminated by ':';

数据:

huangbo yuwen:80,shuxue:89,yingyu:95
xuzheng yuwen:70,shuxue:65,yingyu:81
wangbaoqiang yuwen:75,shuxue:100,yingyu:75

导入数据:

load data local inpath '/home/hadoop/score.txt' into table score;

查询语句:

select * from score;
select name from score;
select scores from score;
select s.scores['yuwen'] from score s;

3.3、struct

建表语句:

create table structtable(id int,course struct<name:string,score:int>)
row format delimited fields terminated by '\t'
collection items terminated by ',';

数据:

1 english,80
2 math,89
3 chinese,95

导入数据:

load data local inpath '/ home/hadoop / structtable.txt' into table structtable;

查询语句:

select * from structtable;
select id from structtable;
select course from structtable;
select t.course.name from structtable t;
select t.course.score from structtable t;

3.4、union type

Union 类型可以在同一时间点,保持恰好有一个指定的数据类型。您可以使用create_union的UDF创建一个实例的类型:

CREATE TABLE union_test(foo UNIONTYPE<int, double, array<string>, struct<a:int,b:string>>);

SELECT foo FROM union_test;

{0:1}
{1:2.0}
{2:["three","four"]}
{3:{"a":5,"b":"five"}}
{2:["six","seven"]}
{3:{"a":8,"b":"eight"}}
{0:9}
{1:10.0}

第一部分,对于 union 的发序列化来说是一个 tag,让它知道哪个 union 的部分被使用。在例子 0,表明声明的第一个数据类型,即是 int,其他如此。
创建 union,必须提供为 create_union UDF 提供 tag。

SELECT create_union(0, key), create_union(if(key<100, 0, 1), 2.0, value), create_union(1, "a", struct(2, "b")) FROM src LIMIT 2;  


{0:"238"}    {1:"val_238"}    {1:{"col1":2,"col2":"b"}}  
{0:"86"}    {0:2.0}    {1:{"col1":2,"col2":"b"}}  

4、学习内容

上节学习内容:Hive 基本操作(二)DML操作
下节学习内容:Hive 高级操作(二)之视图

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值