Hive 序列化与反序列化:数据的 “打包“ 与 “拆箱“ 艺术

一、序列化与反序列化:数据的 "快递运输" 哲学

(1)大佬的灵魂拷问:对象为啥要序列化?

想象一下:你要把一只活蹦乱跳的兔子从北京快递到上海,直接扔箱子里肯定不行 ------ 对象在内存里是 "活物",但要存硬盘、走网络就得先 "打包" 成字节流。这就是序列化的核心使命!

在 Hive 的世界里:

  • 序列化 = 把对象变成 HDFS 能存的格式(比如 insert 操作,给数据 "穿快递箱")
  • 反序列化 = 把 HDFS 数据变回对象(比如 select 查询,拆包裹取数据)

(2)Java、MapReduce、Hive 的 "序列化内卷"

  • Java 序列化:implements Serializable,就像用棉被裹兔子,包装贼厚(数据量大)
  • MapReduce 的 Writable:自己搞了套轻量级包装,用真空袋压缩(效率更高)
  • Hive 的 Serde:数据界的 "快递分拣中心",按不同格式(分隔符)决定怎么打包拆包

(3)Hive 的 "快递流水线" 工作流程

select 查询(反序列化流水线):

HDFS 文件 → InputFileFormat(拆箱工人)→ <key,value> 包裹 → Deserializer(翻译官)→ Row 对象(还原数据真身)

insert 插入(序列化流水线):

Row 对象 → Serializer(打包机)→ <key,value> 包裹 → OutputFileFormat(快递柜)→ HDFS 存储

划重点:分隔符就是快递单上的 "收件地址",Serde 靠它判断怎么拆包!比如 "1 | 张三 | 20" 里的 "|" 就是告诉 Serde:"这里该拆包分字段了!"

二、Serde 图鉴:从逗号到 JSON 的全格式攻略

(1)Serde 的本质:数据界的 "语言翻译官"

Serde 是 "Serializer and Deserializer" 的缩写,相当于数据的双语翻译:

  • 面对不同格式的数据(csv/tsv/json),用不同的 Serde 类解析
  • 默认翻译官是 LazySimpleSerDe,用的是神秘分隔符 ^A(\001),这玩意儿是 Hive 的 "内部暗号"
sql 复制代码
1001^Azs^A23
1002^Alisi^A24
--这里不要直接复制,必须要手打,不然^A会被识别为字符串
--使用ctrl+v可以输出^   ctrl+A可以输出A

(2)Serde 家族成员大揭秘

① 逗号分隔符 CSV:最接地气的打工人
  • 特点:用逗号 "," 分割字段,像菜市场报菜价 "白菜,3 块,5 斤"
  • 对应 Serde:OpenCSVSerde,支持自定义分隔符(比如用数字 7 当分隔符,玩点花活)
  • 建表语句示范
sql 复制代码
CREATE TABLE csv_table(
  id INT,
  name STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  "separatorChar" = ","--这里引号里的内容可以自定义,输入什么就以什么作为分隔符
);
② JSON Serde:职场里的 "全能型选手"
  • 重要程度:面试必问,工作常用,堪称 Serde 界的 "卷王"
  • 两种实现方式

(1) 将jar包放置在/opt/modules文件夹下,然后在hive中执行如下命令:

add jar /opt/modules/json-serde-1.3.8-jar-with-dependencies.jar;

建表时引用row format serde 'org.openx.data.jsonserde.JsonSerDe';
(2)Hive 自带 JsonSerDe:但有坑!只支持 string 类型,number 会报错(就像只会说普通话的翻译,听不懂方言)

虽然名字一样,但包不一样row format serde 'org.apache.hive.hcatalog.data.JsonSerDe';

  • 实战口诀:遇到 JSON 别慌,先扔 jar 包再配置,报错就查 ClassNotFound(缺 jar 包的经典症状)

假如你不会使用 jsonSerder,而对方确实给了你一个 json 文件,阁下应该如何应对?

答:暴力拆解

sql 复制代码
1、新建一个表,这个表中只有一个字段
create table json3(
  line string
);
load 数据
2、查询时,使用get_json_object 来处理
select get_json_object(line,'$.属性1'),get_json_object(line,'$.属性2')....   from json3;
3、将解析出来的属性,插入另一个表格中。

实战演示:
load data local inpath '/home/hivedata/json1.txt' into table json3;
select * from json3;
select get_json_object(line,'$.uid') uid,
       get_json_object(line,'$.uname') uname,
       get_json_object(line,'$.age') age
from json3;
③ 正则 Serde:数据界的 "找茬大师"
  • 技能:按正则表达式解析数据,专治格式不规范的 "刺头数据"
  • 使用场景:日志文件解析(比如 "2025-05-28 10:00:00 INFO [hive] query success")
  • 建表核心 :用正则表达式定义字段分割规则,比如'^([^,]+),([^,]+),([^,]+)$'

(3)默认分隔符 ^A 的 "神秘面纱"

  • 真面目:ASCII 码中的控制字符,八进制表示为 \001,长得像 "^A"
  • 使用场景:Hive 表默认用它当分隔符,比如原生表加载数据时
  • 注意事项:用其他分隔符时一定要显式声明,否则 Hive 会拿 ^A 硬拆包,结果就是数据错乱(好比用菜刀拆巧克力包装,拆是拆开了但全碎了)

三、大佬经验之谈:Serde 避坑指南

  1. JSON 坑王警告:Hive 自带 JsonSerde 只认 string,遇到数字会报错,解决方案:

    • 要么用第三方 jar(推荐)
    • 要么提前把数字转成 string(麻烦但能凑活)
  2. 分隔符冲突处理 :如果数据里本身有分隔符(比如 CSV 里的字段包含逗号),记得用ESCAPE '\\'设置转义字符,不然 Serde 会拆错包

  3. jar 包部署规范:第三方 Serde 的 jar 包必须放 hive/lib 下,然后重启 metastore 和 hiveserver2 服务(相当于让 Hive 重启后认识新翻译官)

四、灵魂拷问:为什么 Serde 这么重要?

打个比方:Hive 是数据餐厅,Serde 就是厨师的刀工 ------

  • 不管是 CSV 的 "土豆丝"(逗号分隔)
  • 还是 JSON 的 "宫保鸡丁"(嵌套结构)
  • 亦或正则的 "雕花萝卜"(复杂格式解析)

Serde 决定了 Hive 能不能把数据 "切" 成正确的字段。记住:建表时指定 Serde,就是告诉 Hive 用什么刀工处理你的数据

最后送大家一句口诀:

"序列化打包发快递,反序列化拆包取东西,Serde 分隔符是关键,JSON 正则各显神通~"

相关推荐
云器科技6 小时前
无需CDP:基于现有数据仓库构建高效用户画像系统
数据仓库·湖仓一体·lakehouse·无需 cdp
xerthwis11 小时前
HDFS:那座正在云化与解构的“古老高墙”
大数据·数据仓库·人工智能·hdfs·数据库开发·数据库架构
xerthwis1 天前
Hadoop:大数据世界的“古老基石”与“沉默的共生者”
大数据·人工智能·hadoop
yumgpkpm1 天前
Cloudera CDH5|CDH6|CDP7.1.7|CDP7.3|CMP 7.3的产品优势分析(在华为鲲鹏 ARM 麒麟KylinOS、统信UOS)
大数据·人工智能·hadoop·深度学习·spark·transformer·cloudera
ghgxm5201 天前
EXCEL使用VBA代码实现按条件查询数据库--简单实用
开发语言·数据仓库·笔记·excel·数据库开发
yumgpkpm1 天前
Hadoop如何用Flink支持实时数据分析需求
大数据·hadoop·分布式·hdfs·flink·kafka·cloudera
喻师傅2 天前
Hive 中 NULL 值在逻辑判断中的“陷阱”(踩坑复盘)
数据仓库·hive·hadoop
涤生大数据2 天前
放弃Canal后,我们用Flink CDC实现了99.99%的数据一致性
大数据·数据仓库·flink·大数据开发·flink cdc·数据开发·实时数据
jinxinyuuuus3 天前
订阅指挥中心:数据可移植性、Schema设计与用户数据主权
数据仓库·人工智能
老徐电商数据笔记3 天前
技术复盘第四篇:Kimball维度建模在电商场景的实战应用
大数据·数据仓库·技术面试