当前位置: 首页 > backend >正文

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 的 "内部暗号"
1001^Azs^A23
1002^Alisi^A24
--这里不要直接复制,必须要手打,不然^A会被识别为字符串
--使用ctrl+v可以输出^   ctrl+A可以输出A

(2)Serde 家族成员大揭秘

① 逗号分隔符 CSV:最接地气的打工人
  • 特点:用逗号 "," 分割字段,像菜市场报菜价 "白菜,3 块,5 斤"
  • 对应 Serde:OpenCSVSerde,支持自定义分隔符(比如用数字 7 当分隔符,玩点花活)
  • 建表语句示范
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 文件,阁下应该如何应对?

答:暴力拆解

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 正则各显神通~"

http://www.xdnf.cn/news/14059.html

相关文章:

  • Angular入门的环境准备步骤工作
  • RabbitMQ缓存详解:由来、发展、核心场景与实战应用
  • HarmonyOS 5中UniApp的调试步骤
  • 宝塔面板如何关闭https强制跳转http/https共存?
  • 【大模型推理学习】flashMLA (二)
  • AWS Well-Architected Framework详解
  • 影刀学院课程地图导航汇总
  • 第18篇:数据库中间件架构中的服务治理与限流熔断机制设计
  • 使用RAG的思想进行PPT生成的框架思路-SlideCoder
  • codeforces 274D. Lovely Matrix
  • JAVA_强制类型转换:
  • Python测试框架库之pytest使用详解
  • 基于Qt的app开发第十四天
  • linux环境配置Go运行环境
  • 缩小 IEEE 会议论文 LaTeX 模板标题、作者信息和正文的间距
  • 零基础实战:用 Docker 和 vLLM 本地部署 bge-reranker-v2-m3 重排序模型
  • day65—回溯—单词搜索(LeetCode-79)
  • Django全栈开发实战与架构思考
  • 栈与队列:数据结构优劣全解析
  • Vue3 + Element Plus 获取表格列信息
  • DIPLOMAT开源程序是基于深度学习的身份保留标记对象多动物跟踪(测试版)
  • 【论文解读】START:自学习的工具使用者模型
  • Objective-c Block 面试题
  • 龙虎榜——20250613
  • 2025国家卫健委减肥食谱PDF完整版(免费下载打印)
  • Vue3 + Element Plus中el-table加载状态分析
  • 高频面试之10 Spark Core SQL
  • 深入解析 Python 的 socket 库:从基础通信到网络编程实战
  • 无人机抛投器模块使用与技术分析!
  • 篇章六 系统性能优化——资源优化——CPU优化(3)