想象一下:你要把一只活蹦乱跳的兔子从北京快递到上海,直接扔箱子里肯定不行 —— 对象在内存里是 "活物",但要存硬盘、走网络就得先 "打包" 成字节流。这就是序列化的核心使命!
在 Hive 的世界里:
select 查询(反序列化流水线):
HDFS 文件 → InputFileFormat(拆箱工人)→
insert 插入(序列化流水线):
Row 对象 → Serializer(打包机)→
划重点:分隔符就是快递单上的 "收件地址",Serde 靠它判断怎么拆包!比如 "1 | 张三 | 20" 里的 "|" 就是告诉 Serde:"这里该拆包分字段了!"
Serde 是 "Serializer and Deserializer" 的缩写,相当于数据的双语翻译:
1001^Azs^A23
1002^Alisi^A24
--这里不要直接复制,必须要手打,不然^A会被识别为字符串
--使用ctrl+v可以输出^ ctrl+A可以输出A
CREATE TABLE csv_table(
id INT,
name STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
"separatorChar" = ","--这里引号里的内容可以自定义,输入什么就以什么作为分隔符
);
(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';
假如你不会使用 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;
'^([^,]+),([^,]+),([^,]+)$'
JSON 坑王警告:Hive 自带 JsonSerde 只认 string,遇到数字会报错,解决方案:
分隔符冲突处理:如果数据里本身有分隔符(比如 CSV 里的字段包含逗号),记得用ESCAPE '\\'
设置转义字符,不然 Serde 会拆错包
jar 包部署规范:第三方 Serde 的 jar 包必须放 hive/lib 下,然后重启 metastore 和 hiveserver2 服务(相当于让 Hive 重启后认识新翻译官)
打个比方:Hive 是数据餐厅,Serde 就是厨师的刀工 ——
Serde 决定了 Hive 能不能把数据 "切" 成正确的字段。记住:建表时指定 Serde,就是告诉 Hive 用什么刀工处理你的数据!
最后送大家一句口诀:
"序列化打包发快递,反序列化拆包取东西,Serde 分隔符是关键,JSON 正则各显神通~"