Hive 复杂数据类型之 STRUCT/MAP/JSON

一、概念

        在  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 是一个结构体,包含 streetcity 和 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,不过比较常见,不在此篇内容介绍。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值