Hive 复杂数据类型实战:ARRAY、MAP、STRUCT 一个案例讲透

简介: 本文以「用户画像」为例,详解 Hive 四大复杂数据类型(ARRAY、MAP、STRUCT、UNIONTYPE)的声明、取值、加载与展开查询,涵盖 JSON/SerDe 加载、LATERAL VIEW explode 展平技巧,并给出生产避坑建议。

摘要:Hive 支持 ARRAY、MAP、STRUCT、UNIONTYPE 四类复杂数据类型,是存储 JSON、嵌套日志、用户画像等半结构化数据的关键。本文用一个「用户画像」案例,讲清它们的声明方式、取值语法、加载与展开查询,并给出使用边界与避坑建议。
关键词:Hive 复杂数据类型, ARRAY, MAP, STRUCT, UNIONTYPE, LATERAL VIEW explode, JSON SerDe, 嵌套结构

在 Hive 里,除了 INT、STRING、DOUBLE 这类基本类型,还有一类容易被忽视但极其好用的复杂数据类型:ARRAY、MAP、STRUCT,以及极少用到的 UNIONTYPE。当我们要落地 JSON、埋点日志、用户画像这类半结构化数据时,它们能让我们少建很多表、少写很多 ETL。

本文用一个贯穿全篇的「用户画像」案例,把四种类型的声明、取值、加载、展开查询一次讲透。

一、四大复杂类型速览

先建立整体印象,后面再逐个拆解。

类型 声明示例 取值方式 典型场景
ARRAY ARRAY<STRING> arr[0](0 基) 标签、多值字段(爱好、分类)
MAP MAP<STRING,STRING> m['key'] 稀疏属性、维度 KV
STRUCT STRUCT<name:type,...> s.field 嵌套对象(地址、联系人)
UNIONTYPE UNIONTYPE<int,string> 极少用 异构值(支持有限)

在这里插入图片描述

一句话记忆:ARRAY 是有序列表、MAP 是键值对、STRUCT 是带名字的对象,三者都能任意嵌套。

二、ARRAY:有序的同类型列表

ARRAY 存放「同一类型的多个值」,按下标访问,下标从 0 开始,越界返回 NULL。

CREATE TABLE user_tags (
  user_id STRING,
  tags    ARRAY<STRING>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY ',';   -- 集合内元素用逗号分隔

-- 取第一个标签、统计标签数
SELECT user_id, tags[0] AS first_tag, size(tags) AS tag_cnt
FROM user_tags;

常见场景:用户的兴趣标签、商品类目、近 N 天的访问日期。注意 COLLECTION ITEMS TERMINATED BY 默认是 ^B(ASCII 2),生产里常改成逗号、竖线等可读分隔符。

三、MAP:灵活的键值对

MAP 存「键到值的映射」,键必须是基本类型,值任意。适合字段稀疏、列不固定的属性,比如用户扩展维度。

CREATE TABLE user_attrs (
  user_id STRING,
  attrs   MAP<STRING,STRING>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':';          -- 键值之间用冒号分隔

-- 取年龄、列出所有键
SELECT user_id,
       attrs['age']        AS age,
       map_keys(attrs)     AS all_keys
FROM user_attrs;

取值时键不存在返回 NULL,不会报错——这正是 MAP 比「堆一堆 col1/col2/col3 列」更安全的地方。

四、STRUCT:带字段名的嵌套对象

STRUCT 像一个「内嵌的小表」,字段各有自己的名字和类型,用点号访问。最适合表达地址、联系人这种「成组出现」的对象。

CREATE TABLE user_addr (
  user_id STRING,
  addr   STRUCT<street:STRING, city:STRING, zip:STRING>
);

SELECT user_id, addr.city, addr.zip
FROM user_addr;

五、综合案例:一张用户画像表

把上面三种类型组合起来,就是真实世界里最常见的「用户画像」结构——基本字段 + 标签数组 + 扩展 MAP + 嵌套地址 STRUCT,而地址里还能再嵌一个电话数组。

CREATE TABLE user_profile (
  user_id  STRING,
  name     STRING,
  tags     ARRAY<STRING>,                     -- 兴趣标签
  attrs    MAP<STRING,STRING>,                -- 扩展属性
  address  STRUCT<                            -- 嵌套对象
             street:STRING,
             city:STRING,
             contacts:ARRAY<STRING>>           -- STRUCT 里再嵌 ARRAY
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY '|'
MAP KEYS TERMINATED BY ':';

对应的嵌套结构与取值路径如下,建议对照图理解:

在这里插入图片描述

取值示例:

  • tags[0] → 第一个兴趣标签
  • attrs['age'] → 年龄属性
  • address.city → 所在城市
  • address.contacts[1] → 第二个联系电话

六、怎么把数据写进去:文本 vs JSON

上面用 ROW FORMAT DELIMITED 处理「扁平分隔文本」,靠一堆分隔符拼出嵌套结构,可读性差、容易错。

更推荐的写法是用 JSON SerDe——源数据本来就是 JSON,一行一个对象,Hive 自动映射嵌套层级:

CREATE TABLE user_profile_json (
  user_id  STRING,
  tags     ARRAY<STRING>,
  attrs    MAP<STRING,STRING>,
  address  STRUCT<street:STRING, city:STRING,
                  contacts:ARRAY<STRING>>
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe';

导入原始 JSON 即可,无需关心分隔符。第三方还有 org.openx.data.jsonserde.JsonSerDe,功能更全(支持把 NULL、坏数据映射成 NULL)。

七、怎么查出来:LATERAL VIEW explode

复杂类型把多值「挤」进了一行,但分析时往往要拍平。ARRAY / MAP 用 explode 配合 LATERAL VIEW 展开成多行:

-- 把每个用户的标签拆成多行
SELECT u.user_id, t.tag
FROM user_profile u
LATERAL VIEW explode(u.tags) t AS tag;

-- MAP 展开:一行变「键、值」两列
SELECT u.user_id, kv.key, kv.value
FROM user_profile u
LATERAL VIEW explode(u.attrs) kv AS key, value;

explode 会「炸开」集合;LATERAL VIEW 让炸出的行与原表的其它列横向关联,不丢上下文。没有 LATERAL VIEW 时,一个 explode 无法直接和原表其它普通列共存。

八、实践建议

  1. 能扁平就扁平:纯分析型宽表优先用基本类型拆列,复杂类型会拖慢谓词下推和列式存储压缩比。
  2. 半结构化才上复杂类型:JSON 日志、动态属性、稀疏字段——这些场景复杂类型能省大量 ETL。
  3. 取值要防 NULL:ARRAY 越界、MAP 缺键都返回 NULL,统计前用 nvl() 兜底。
  4. UNIONTYPE 谨慎用:支持有限、语义晦涩(带 tag 的联合体),仅在确需「一字段多类型」时考虑。
  5. 优先 JSON SerDe:源是 JSON 时,SerDe 比手工分隔符更稳、更易维护。

小结

ARRAY/MAP/STRUCT 三兄弟让 Hive 能原生表达嵌套与半结构化数据:ARRAY 管有序列表、MAP 管 KV、STRUCT 管命名对象,三者可任意嵌套。配合 JSON SerDe 加载、LATERAL VIEW explode 展开,再也不用为了一个 JSON 拆出十几张表。掌握它们,你的 Hive 表设计会从容很多。

目录
相关文章
|
8天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
3720 36
|
8天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
3260 10
|
3天前
|
云安全 人工智能 安全
|
9天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1695 6
|
9天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
2032 4
|
云安全 安全 网络安全
|
22天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
3891 55
|
14天前
|
人工智能 JSON Linux
【保姆级】ComfyUI部署教程(下载+安装+配置+工作流,2026最新)
ComfyUI 是一款开源节点式AI生成工具,支持图像、视频、音频及3D内容创作。通过拖拽连线组合模型加载、提示词、采样等节点,构建可复用、易修改的工作流,兼容SD1.5、SDXL、Flux、Qwen Image等主流模型。