ZhangZhihui's Blog  

在 Hive 中,SerDeSerializer(序列化器)和 Deserializer(反序列化器)的缩写。

它是 Hive 架构中非常核心的组件,充当了 HDFS 字节流Hive 表格行/列 之间的“翻译官”。


1. SerDe 的核心工作流程

Hive 并不真正“拥有”数据,它只是管理元数据(Schema)。当你执行 SQL 时,SerDe 负责处理数据的转换:

  • 读取数据(Deserializer):

    将 HDFS 文件中的原始字节流(二进制、文本等)反序列化为 Hive 内部能够识别的 Row 对象(行对象)。

  • 写入数据(Serializer):

    将 Hive 的 Row 对象序列化为特定的 字节格式,以便持久化存储到 HDFS 中。


2. 为什么需要 SerDe?

SerDe 实现了 解耦。

Hive 的执行引擎(Query Engine)不需要关心数据在 HDFS 上是怎么存的(是逗号分隔的文本?还是压缩的二进制?)。它只需要调用对应的 SerDe,就能拿到结构化的数据。这使得 Hive 能够支持几乎任何格式的数据。


3. 常用的内置 SerDe 类型

当你创建表时,可以通过 ROW FORMAT SERDE 来指定。

SerDe 类型 对应文件格式 适用场景
LazySimpleSerDe TextFile 默认的 SerDe,用于处理常见的 CSV、TSV 等分隔符文本。
OrcSerDe ORC 用于处理高性能的列式存储 ORC 文件。
ParquetHiveSerDe Parquet 用于处理跨平台通用的 Parquet 列式存储。
JsonSerDe JSON 直接解析 HDFS 上的 JSON 文本。
OpenCSVSerDe CSV 增强版的 CSV 解析,支持引号转义。
RegexSerDe 任意文本 使用正则表达式提取字段(常用于解析复杂的 Apache 访问日志)。

4. 语法示例

在建表语句(DDL)中,SerDe 的应用如下:

CREATE TABLE my_json_table (
    id INT,
    name STRING
)
-- 指定特定的 SerDe 类
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE;

如果你使用的是更高级的文件格式,Hive 会自动关联对应的 SerDe:

CREATE TABLE my_orc_table (id INT)
STORED AS ORC; 
-- Hive 内部会自动指定为 org.apache.hadoop.hive.ql.io.orc.OrcSerDe

5. 如何选择 SerDe?

  • 追求性能:优先使用 ORCParquet 对应的 SerDe。它们不仅是文件格式,还配合了向量化查询。

  • 处理非结构化数据:如果你的日志格式非常奇葩(比如中间夹杂了多种分隔符),使用 RegexSerDe 通过正则提取是最灵活的。

  • 处理嵌套数据:如果是复杂的 JSON 嵌套,建议使用 JsonSerDe,它可以直接将 JSON Key 映射为 Hive 的 STRUCTMAP 类型。

 

posted on 2025-12-24 21:48  ZhangZhihuiAAA  阅读(0)  评论(0)    收藏  举报