一、序列化与反序列化:数据的 "快递运输" 哲学
(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 避坑指南
-
JSON 坑王警告:Hive 自带 JsonSerde 只认 string,遇到数字会报错,解决方案:
- 要么用第三方 jar(推荐)
- 要么提前把数字转成 string(麻烦但能凑活)
-
分隔符冲突处理 :如果数据里本身有分隔符(比如 CSV 里的字段包含逗号),记得用
ESCAPE '\\'
设置转义字符,不然 Serde 会拆错包 -
jar 包部署规范:第三方 Serde 的 jar 包必须放 hive/lib 下,然后重启 metastore 和 hiveserver2 服务(相当于让 Hive 重启后认识新翻译官)
四、灵魂拷问:为什么 Serde 这么重要?
打个比方:Hive 是数据餐厅,Serde 就是厨师的刀工 ------
- 不管是 CSV 的 "土豆丝"(逗号分隔)
- 还是 JSON 的 "宫保鸡丁"(嵌套结构)
- 亦或正则的 "雕花萝卜"(复杂格式解析)
Serde 决定了 Hive 能不能把数据 "切" 成正确的字段。记住:建表时指定 Serde,就是告诉 Hive 用什么刀工处理你的数据!
最后送大家一句口诀:
"序列化打包发快递,反序列化拆包取东西,Serde 分隔符是关键,JSON 正则各显神通~"