Hive 数据模型 与 Hive SerDe(序列化与反序列化)

Hive 数据模型

Hive 的数据模型是基于 Hadoop 的分布式文件系统(HDFS)上的数据存储模型,提供了类似于关系数据库的结构(如表、分区和桶),但与传统的关系型数据库不同,Hive 更侧重于海量数据的查询和分析。

Hive 表(Tables)

Hive 表是 Hive 数据模型的基础,类似于传统数据库中的表。Hive 表用于存储数据的定义和元数据。表中的数据是按行存储的,每行数据对应一条记录。Hive 支持两种类型的表:

  • 外部表(External Tables):数据存储在外部系统(如 HDFS)中,Hive 只是对外部数据提供一个接口,删除表时数据不会被删除。适用于 Hive 以外的工具也需要访问该数据的场景。
  • 内部表(Managed Tables):数据和表定义都存储在 Hive 中,删除表时数据也会被删除。适用于 Hive 管理的数据。

创建 Hive 表

sql 复制代码
-- 创建一个内部表
CREATE TABLE table_name (
    column1_name column1_type,
    column2_name column2_type,
    ...
);

-- 创建一个外部表
CREATE EXTERNAL TABLE table_name (
    column1_name column1_type,
    column2_name column2_type,
    ...
)
LOCATION 'hdfs://path_to_data';

Hive 分区(Partitions)

Hive 分区是根据某个列(通常是时间或其他维度列)将表数据分区存储的方式。分区使得数据可以根据某些条件(如日期、地区)进行组织,这样可以加速查询操作,因为查询时 Hive 只需要扫描相关的分区,而不是扫描整个表的数据。

每个分区对应一个目录,目录中存储了该分区的数据文件。分区列通常是日期或其他维度(如地域、产品类别等)。

创建分区表

sql 复制代码
CREATE TABLE sales (
    id INT,
    amount DECIMAL(10,2)
)
PARTITIONED BY (year INT, month INT, day INT);

添加分区

sql 复制代码
-- 为表添加分区
ALTER TABLE sales ADD PARTITION (year=2023, month=10, day=15)
LOCATION 'hdfs://path_to_partition_data';

Hive 桶(Bucketing)

Hive 桶是将表的数据按某些规则(通常是哈希值)划分成多个固定大小的存储单元,每个存储单元称为"桶"。桶机制通常用于优化数据的分布和性能,特别是在执行 JOIN 操作时。将数据划分为桶后,Hive 可以更高效地执行等值连接(JOIN),因为数据在同一个桶内是预先分配好的。

创建桶表

sql 复制代码
CREATE TABLE employees (
    id INT,
    name STRING,
    department STRING
)
CLUSTERED BY (id) INTO 4 BUCKETS;

在这个例子中,数据按 id 字段的哈希值分布到 4 个桶中。

Hive SerDe(序列化与反序列化)

在 Hive 中,SerDeSerializationDeserialization 的缩写)是处理数据存储格式的核心组件。它负责数据在 Hive 和外部存储系统(如 HDFS)之间的序列化和反序列化操作。具体来说,SerDe 定义了如何将数据从 Hive 表的行(对象模型)转换为存储在磁盘上的字节流(序列化),以及如何将字节流重新转换回 Hive 表中的行(反序列化)。

什么是序列化与反序列化?

  • 序列化(Serialization):将数据从 Hive 表的行(内存中的对象)转化为字节流,并存储到外部存储系统(如 HDFS)中。

  • 反序列化(Deserialization):将存储在外部存储系统中的字节流转换回 Hive 表的行(内存中的对象)进行查询或操作。

Hive 中的 SerDe 作用

在 Hive 中,数据的存储格式和数据如何从存储中读取是通过 SerDe 来控制的。每种存储格式(如 CSV、Parquet、ORC、Avro 等)都有相应的 SerDe 规则。Hive 通过 SerDe 确定如何解析存储格式,并将数据转换为 Hive 表的内部表示。

  • 序列化: 将表中的数据转化为指定格式并存储。
  • 反序列化: 将存储在指定格式的数据转化为 Hive 可查询的数据格式。
    Hive 默认提供了一些常用的 SerDe,用户也可以自定义 SerDe 来支持新的数据格式。

Hive 常见的 SerDe 类型

  • TextFile:最常见的文件格式(如 CSV、TSV 等)。它使用分隔符(如逗号或制表符)来区分每一列的数据。TextFile SerDe 适用于处理简单的文本数据。

  • LazySimpleSerDe:用于读取和写入文本格式的文件,通常用于处理由分隔符分隔的行(例如 CSV 或 TSV)。它通过延迟读取行来提高性能。

sql 复制代码
CREATE TABLE my_table (
    id INT,
    name STRING,
    age INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
  • ORC (Optimized Row Columnar):一种列式存储格式,提供了较高的压缩比和性能。适用于处理大数据量且查询较为频繁的场景。ORC SerDe 能有效压缩数据,并提供快速的查询速度。
sql 复制代码
CREATE TABLE my_orc_table (
    id INT,
    name STRING,
    age INT
)
STORED AS ORC;
  • Parquet:另一种列式存储格式,特别适合于处理嵌套数据结构。它支持高级数据类型,并且具有较好的压缩性能。Parquet 文件格式是 Apache Hadoop 生态系统中广泛使用的格式。
sql 复制代码
CREATE TABLE my_parquet_table (
    id INT,
    name STRING,
    age INT
)
STORED AS PARQUET;
  • Avro:一种用于数据交换的二进制格式,支持丰富的数据类型和数据模式。它广泛用于 Kafka 等流式处理系统中,适合高效的数据序列化和反序列化。
sql 复制代码
CREATE TABLE my_avro_table (
    id INT,
    name STRING,
    age INT
)
STORED AS AVRO;
  • Custom SerDe:用户可以自定义 SerDe,以支持自定义的数据格式。例如,如果你有一个特殊的日志文件格式或某种自定义的二进制格式,可以通过实现 Hive SerDe 接口来自定义序列化和反序列化逻辑。

如何使用 SerDe

在创建 Hive 表时,可以通过 ROW FORMAT 和 STORED AS 来指定使用的 SerDe 类型。

使用 ROW FORMAT 和 STORED AS 指定 SerDe

  • TextFile 格式
sql 复制代码
CREATE TABLE my_text_table (
    id INT,
    name STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' 
STORED AS TEXTFILE;

这里,FIELDS TERMINATED BY 定义了每列数据之间的分隔符。

  • 自定义 SerDe
sql 复制代码
CREATE TABLE my_custom_table (
    id INT,
    name STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES ("input.regex" = "^(.*),$")
STORED AS TEXTFILE;

在这个例子中,SERDE 关键字指定了一个自定义的 SerDe,WITH SERDEPROPERTIES 可以用来设置该 SerDe 的配置参数。

SerDe 的工作流程

  • 反序列化过程

(1)当 Hive 执行查询时,查询中的 SELECT 语句会涉及到读取数据。

(2)Hive 通过指定的 SerDe 将存储在外部系统(如 HDFS)中的数据文件进行反序列化,即将字节流转换为 Hive 能够操作的内存数据结构。

(3)这些数据被加载到 Hive 内存中,进一步用于查询处理。

  • 序列化过程

(1)当 Hive 执行插入数据操作时,数据会首先被转换为相应的列式或行式数据结构。

(2)然后,Hive 会通过指定的 SerDe 将这些数据进行序列化,将其转换为适合存储的字节流。

(3)数据被写入外部存储(如 HDFS)中。

自定义 SerDe

Hive 允许用户实现自己的 SerDe,以便支持自定义的数据格式。实现一个自定义 SerDe 需要继承 org.apache.hadoop.hive.serde2.SerDe 接口,并实现其中的 serialize 和 deserialize 方法。serialize 用于将数据从 Java 对象转换为字节流,deserialize 用于将字节流转换回 Java 对象。

java 复制代码
public class MyCustomSerDe implements SerDe {
    @Override
    public void initialize(Configuration conf, Properties tbl) throws SerDeException {
        // 初始化代码
    }

    @Override
    public Object deserialize(BytesWritable blob) throws SerDeException {
        // 反序列化代码
        return new MyCustomObject();
    }

    @Override
    public Class<? extends Writable> getSerializedClass() {
        // 返回序列化后数据类型
        return MyCustomObject.class;
    }

    @Override
    public Writable serialize(Object obj, ObjectInspector objInspector) throws SerDeException {
        // 序列化代码
        return new BytesWritable();
    }
}

SerDe 与存储格式的关系

  • TextFile SerDe:适用于存储格式为文本的数据,按行存储,每行数据通常使用分隔符分隔不同的字段。

  • ORC/Parquet/Avro SerDe:适用于列式存储的格式,能够提供更高效的存储和查询性能,尤其是在大规模数据处理和压缩场景下。

  • 自定义 SerDe:当需要处理特定格式的数据时,可以自定义 SerDe 来支持自定义的序列化和反序列化逻辑。

总结

  • SerDe 是 Hive 数据处理的关键,它定义了如何将数据存储在磁盘上的格式与 Hive 查询引擎中使用的数据格式之间进行转换。

  • 序列化与反序列化 是将数据在存储与查询之间转化的过程。不同的存储格式(如 TEXTFILE、ORC、PARQUET、AVRO 等)需要不同的 SerDe 来处理。

  • Hive 提供了多种内置的 SerDe,也允许用户创建自定义的 SerDe 来支持特殊的存储格式。

通过使用适合的 SerDe,可以提高数据存储的效率,优化查询性能,并支持多种复杂的数据类型。

相关推荐
tsyjjOvO2 天前
SpringMVC 从入门到精通
数据仓库·hive·hadoop
Francek Chen2 天前
【大数据存储与管理】分布式数据库HBase:05 HBase运行机制
大数据·数据库·hadoop·分布式·hdfs·hbase
zzzzzwbetter2 天前
Hadoop完全分布式部署-Master的NameNode以及Slaver2的DataNode未启动
大数据·hadoop·分布式
weixin_449310843 天前
ETL转换和数据写入小满OKKICRM的技术细节
数据仓库·php·etl
IvanCodes3 天前
Hive IDE连接及UDF实战
ide·hive·hadoop
yumgpkpm3 天前
华为昇腾910B 开源软件GPUStack的介绍(Cloudera CDH、CDP)
人工智能·hadoop·elasticsearch·flink·kafka·企业微信·big data
lifewange3 天前
Hive数据库
数据库·hive·hadoop
五月天的尾巴5 天前
hive数据库模糊查询表名
hive·查询表名
蓝魔Y5 天前
hive—1.1、执行优化
hive
快乐非自愿5 天前
OpenClaw 生态适配:Hadoop/Hive 技能现状与企业级集成方案
大数据·hive·hadoop·分布式·openclaw