一、概念
在 Hive 中,除了常见的基本数据类型(如 INT、STRING、FLOAT 等),还支持一些特殊的数据类型,如 STRUCT、MAP 和 JSON,这些数据类型允许处理更复杂和嵌套的数据结构。
1.1 STRUCT
STRUCT 是一种复合数据类型,可以包含多个字段,每个字段可以是不同的数据类型。它类似于关系数据库中的记录或行。
定义和使用:
CREATE TABLE tmp_employee (
name STRING,
age INT,
address STRUCT<street: STRING, city: STRING, state: STRING>
);
insert into tmp_employee values('zhangsan',18,struct('changan','xian','shannxi'));
select * from tmp_employee
查询结构体中的字段:
select
name
,age
,address.street
,address.city
,address.state
from tmp_employee;
在这个例子中,address
是一个结构体,包含 street
、city
和 state
三个字段。
1.2 MAP
MAP 是一种键值对集合,其中每个键都唯一,值可以是任意数据类型。它类似于 Python 中的字典或 Java 中的 HashMap。
CREATE TABLE student (
name STRING,
subjects MAP<STRING, INT>
);
insert into tmp_student values('zhangsan',map('math',98));
select *
from tmp_student
;
select name,subjects['math'] as math_score
from tmp_student
;
在这个例子中,subjects
是一个 Map,其中键是科目名称,值是分数。
1.3 json
Hive 不直接支持 JSON 数据类型,但可以通过使用 Hive 的 UDF(用户自定义函数)来处理 JSON 数据。常用的 UDF 有 get_json_object
和 json_tuple
。
我们使用 named_struct & to_json 来生成 JSON 字符串,代码如下:
select to_json(named_struct('name','zhangsan','age',22,'city','xian')) as jst;
使用 get_json_object
和 json_tuple 来解析其中字段,代码如下:
select
get_json_object(jst,'$.name') as name
,get_json_object(jst,'$.age') as age
,get_json_object(jst,'$.city') as city
from
(select to_json(named_struct('name','zhangsan','age',22,'city','xian')) as jst)
;
select
t1.name
,t1.age
,t1.city
from
(select to_json(named_struct('name','zhangsan','age',22,'city','xian')) as jst) t
lateral view json_tuple(t.jst,'name','age','city') t1 as name,age,city
;
以上只是这两个函数的简单用法,更复杂用法比如解析嵌套JSON字段可询问chatgpt,在此不做赘述。
当然复杂数据类型还包括 ARRAY,不过比较常见,不在此篇内容介绍。