一,Hive SerDe

Hive SerDe(Serialization/Deserialization)是 Hive 中用于序列化和反序列化数据的框架。它允许 Hive 将数据从一种格式转换为另一种格式,以便在 Hive 中进行查询和分析。SerDe 是 Hive 中一个非常重要的组件,因为它允许 Hive 与各种数据格式进行交互,包括 CSV、JSON、Avro、ORC、Parquet 等。

序列化器(Serializer)和反序列化器(Deserializer)

SerDe 是两个单词的拼写 serialized(序列化) 和 deserialized(反序列化)。 什么是序列化和反序列化呢?

当进程在进行远程通信时,彼此可以发送各种类型的数据,无论是什么类型的数据都会以 二进制序列的形式在网络上传送。发送方需要把对象转化为字节序列才可在网络上传输, 称为对象序列化;接收方则需要把字节序列恢复为对象,称为对象的反序列化。

Hive的反序列化是对key/value反序列化成hive table的每个列的值。Hive可以方便 的将数据加载到表中而不需要对数据进行转换,这样在处理海量数据时可以节省大量的时间。

读写行数据流程如下:

- 读

HDFS files --> InputFileFormat --> --> Deserializer --> Row object

- 写

Row object --> Serializer --> --> OutputFileFormat --> HDFS files

当向hdfs写数据的时候,先经过序列化,将数据转化成字节序列,然后以指定的格式(outputformat) 输出到hdfs. 而从hdfs读数据时,则是一个相反的过程。

二,SerDe类型

1. LazySimpleSerDe:用于处理简单的文本数据格式,如 CSV、TSV 等

用于将文本文件中的数据序列化成Hive表中的数据格式和将Hive表中的数据反序列化成文本文件格式。

逻辑:

其逻辑相对较简单:对于输入数据,LazySimpleSerDe会直接按照分隔符进行拆分,并将每行数据映射到表中的列。例如,假设我们有以下文本文件:

1001,John,30

1002,Jane,25

如果我们使用LazySimpleSerDe将其序列化到如下Hive表中:

CREATE TABLE test (

id INT,

name STRING,

age INT

) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'

WITH SERDEPROPERTIES (

"serialization.format" = ",",

"field.delim" = ","

);

则该表的结果如下:

id name age

1001 John 30

1002 Jane 25

在输出数据时,LazySimpleSerDe会将每个列都转换为字符串,并在每个列之间添加分隔符。

例如,如果我们有一个Hive表并想要将其输出到文本文件,则可以使用以下命令:

INSERT OVERWRITE LOCAL DIRECTORY '/path/to/output'

ROW FORMAT DELIMITED

FIELDS TERMINATED BY ','

STORED AS TEXTFILE

SELECT * FROM test;

则输出的文本文件内容如下:

1001,John,30

1002,Jane,25

用法

要使用LazySimpleSerDe,我们需要将其指定为Hive表的ROW FORMAT SERDE。可以在创建表时指定,如上述例子所示,也可以在已有的表上进行更改。

如果需要更改现有表的SerDe,则可以使用以下语句:

ALTER TABLE my_table

SET SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'

WITH SERDEPROPERTIES (

"serialization.format" = ",",

"field.delim" = ","

);

其中serialization.format参数指定了输入数据的格式(用于反序列化),而field.delim参数则指定了分隔符。

除了这两个属性外,LazySimpleSerDe还支持其他一些配置属性,例如escape.delim、quote.delim等,可根据具体情况进行设置。

总之,LazySimpleSerDe是一个非常简单易用的SerDe,特别适合处理单纯的文本文件,但对于复杂数据类型和嵌套结构,可能需要使用其他更高级的SerDe。

1. 1 LazyBinarySerDe

和LazySimpleSerDe具有相似的逻辑,只是前者可以处理二进制数据格式。在序列化时,它会将数据转换为二进制格式,并在反序列化时将其转换回文本格式。它主要用于按行存储的二进制格式数据。与其他序列化/反序列化库不同,LazyBinarySerDe可以延迟解析数据,避免了大量解析无关数据的开销,提高了处理效率。

LazyBinarySerDe和LazySimpleSerDe区别

序列化方式:LazyBinarySerDe采用按行存储的二进制格式进行序列化和反序列化操作,而LazySimpleSerDe则采用按行存储的文本格式进行序列化和反序列化。数据类型:LazyBinarySerDe支持更多的数据类型,包括数值类型、日期类型、时间戳类型、布尔类型、字节数组类型和字符串类型等;而LazySimpleSerDe则只支持简单的数据类型,例如字符串、整数和浮点数等。性能:由于LazyBinarySerDe采用二进制格式存储数据,并且可以延迟解析数据,因此它比LazySimpleSerDe具有更好的性能表现,尤其在处理大规模数据集时表现更加明显。应用场景:由于LazyBinarySerDe适用于各种复杂的数据类型和结构,并且具有更好的性能表现,因此它适用于需要高效处理大规模数据集的场景,例如数据仓库、数据挖掘、日志分析等领域。而LazySimpleSerDe则适用于简单的数据处理任务,例如数据导入和导出等。

总之,LazyBinarySerDe是一种基于二进制格式存储数据的高性能序列化/反序列化库,它支持更多的数据类型并且可以延迟解析数据,适用于需要高效处理大规模数据集的场景。而LazySimpleSerDe则适用于简单的数据处理任务,并且使用文本格式进行序列化和反序列化操作。

2.ColumnarSerDe

适用于针对列式存储格式的列存储数据(如ORC或Parquet),它将列组织成连续的位,并使用run-length encoding等技术来提高压缩比例。

ColumnarSerDe适用于列式存储格式的数据,例如ORC或Parquet等。在读取这些格式的数据时,Hive使用ColumnarSerDe来将其反序列化为Hive表中的行格式,而在写入数据时,它会将每个行映射到连续的位上,并使用run-length encoding等技术来提高压缩比例。

它主要用于高效处理大规模数据集。与行式存储格式不同,列式存储格式将每个列的数据存储在独立的数据块中,这种方式可以减少读取不必要数据的次数,提高数据访问效率。

以下是一些关键特点和优势:

列式存储格式:ColumnarSerDe采用列式存储格式,该格式将每个列的数据存储在独立的数据块中,这种方式可以提高查询效率,尤其是在需要过滤、聚合和排序等操作时表现更为突出。压缩和编码:ColumnarSerDe支持多种压缩算法和编码方式,例如gzip、lzo和snappy等,这些方式可以有效地减小数据大小,提高数据传输和存储效率。序列化和反序列化:ColumnarSerDe使用按列存储的方式进行序列化和反序列化操作,这种方式避免了读取不必要数据的开销,减少了解析数据的时间和成本。数据类型:ColumnarSerDe支持各种常见的数据类型,例如整数、浮点数、字符串、日期和时间戳等,并且支持自定义数据类型的定义。应用场景:ColumnarSerDe适用于需要高效处理大规模数据集的场景,例如数据仓库、数据挖掘、日志分析等领域。它可以帮助用户实现更快速、准确和可扩展的数据处理任务。

3. MetadataTypedColumnsetSerDe:

MetadataTypedColumnsetSerDe主要是按行进行序列化和反序列化操作,也就是将数据记录逐行解析为结构化数据,并将其转换为可以进行二进制或文本编码的格式,以便于存储到文件系统中或传输到其他系统中。

MetadataTypedColumnsetSerDe的序列化和反序列化过程依赖于元数据信息,这些元数据信息通常来自于Hive表定义,包括表名、列名以及每个列的数据类型等。在序列化和反序列化时,MetadataTypedColumnsetSerDe使用元数据信息来解释和验证数据内容,并确保数据的完整性和一致性。

由于MetadataTypedColumnsetSerDe是基于元数据信息进行序列化和反序列化的,因此可以方便地处理各种复杂的数据类型和结构,例如数组、嵌套结构和非标准化数据类型等。此外,它还支持各种压缩算法和编码方式,并且可扩展性和灵活性也非常好。

4.AvroSerDe:

AvroSerDe是一种序列化/反序列化库,它用于将数据从Hadoop文件系统中的二进制格式转换为可读取的结构化数据,并将结果写回到Hadoop文件系统。与其他序列化/反序列化库不同,AvroSerDe支持动态模式定义,可以在运行时生成或修改模式,从而实现高度灵活性和可扩展性。

以下是AvroSerDe的一些关键特点和优势:

动态模式定义:AvroSerDe支持动态模式定义,可以在运行时生成或修改模式,并且可以使用JSON格式来定义模式。这种方式使得AvroSerDe具有更好的架构兼容性和扩展性。多语言支持:AvroSerDe支持多种编程语言,例如Java、Python、C++等,这意味着可以跨越不同编程语言和平台进行数据交换,非常方便。数据类型支持:AvroSerDe支持各种常见的数据类型,例如整数、浮点数、字符串、日期和时间戳等,并且还支持数组和嵌套结构等复杂数据类型。压缩和编码:AvroSerDe支持多种压缩算法和编码方式,例如gzip、lzo和snappy等,这些方式可以有效地减小数据大小,提高数据传输和存储效率。应用场景:AvroSerDe适用于需要高度灵活和可扩展的数据处理场景,例如大规模数据集成、流式数据处理等领域。它可以帮助用户实现更快速、准确和可扩展的数据处理任务。

3-4.MetadataTypedColumnsetSerDe和AvroSerDe序列化区别

文件格式:MetadataTypedColumnsetSerDe是基于Hive表定义的元数据信息进行序列化和反序列化的,适用于多种文件格式存储;而AvroSerDe则针对Avro文件格式进行优化。Avro文件格式是一种灵活的数据交换格式,支持动态模式定义,并且可以跨越不同编程语言和平台进行数据交换。数据类型:MetadataTypedColumnsetSerDe适用于各种复杂的数据类型和结构,例如数组、嵌套结构和非标准化数据类型等;而AvroSerDe则具有更好的架构兼容性和扩展性,可以支持各种数据类型和自定义数据类型的定义。应用场景:MetadataTypedColumnsetSerDe主要适用于需要使用Hive表定义的元数据信息的数据处理任务,例如数据仓库和数据分析任务;而AvroSerDe适用于需要高度灵活和可扩展的数据处理场景,例如大规模数据集成、流式数据处理等领域。

总之,MetadataTypedColumnsetSerDe和AvroSerDe都是按行进行序列化和反序列化操作的序列化/反序列化库,它们都具有各自的优点和适用场景。在选择哪种库时,需要根据具体需求来决定。如果需要使用Hive表定义的元数据信息进行数据处理,则可以考虑MetadataTypedColumnsetSerDe;如果需要灵活、可扩展和跨平台的数据交换方案,则可以考虑AvroSerDe。

5. OrcSerDe:

OrcSerDe是一种基于ORC文件格式的序列化/反序列化库,它主要用于高效地存储和处理大规模数据集。ORC文件格式是一种高度优化的列式存储格式,它将每个列的数据存储在独立的数据块中,并使用索引和统计信息来提高查询效率。

OrcSerDe优势:

ORC文件格式:OrcSerDe采用ORC文件格式进行序列化和反序列化操作,该格式是一种高度优化的列式存储格式,能够提高查询效率并减少存储空间。压缩和编码:OrcSerDe支持多种压缩算法和编码方式,例如gzip、lzo和snappy等,这些方式可以有效地减小数据大小,提高数据传输和存储效率。统计信息和索引:OrcSerDe使用统计信息和索引来加速查询操作,例如通过过滤条件和聚合操作等。数据类型:OrcSerDe支持各种常见的数据类型,例如整数、浮点数、字符串、日期和时间戳等,并且还支持数组和嵌套结构等复杂数据类型。应用场景:OrcSerDe适用于需要高效存储和处理大规模数据集的场景,例如数据仓库、数据挖掘、日志分析等领域。它可以帮助用户实现更快速、准确和可扩展的数据处理任务。

6. ParquetHiveSerDe:

Parquet文件格式:ParquetHiveSerDe采用Parquet文件格式进行序列化和反序列化操作,该格式是一种高度优化的列式存储格式,能够提高查询效率并减少存储空间。

压缩和编码:ParquetHiveSerDe支持多种压缩算法和编码方式,例如gzip、lzo和snappy等,这些方式可以有效地减小数据大小,提高数据传输和存储效率。统计信息和索引:ParquetHiveSerDe使用统计信息和索引来加速查询操作,例如通过过滤条件和聚合操作等。数据类型:ParquetHiveSerDe支持各种常见的数据类型,例如整数、浮点数、字符串、日期和时间戳等,并且还支持数组和嵌套结构等复杂数据类型。应用场景:ParquetHiveSerDe适用于需要高效存储和处理大规模数据集的场景,例如数据仓库、数据挖掘、日志分析等领域。它可以帮助用户实现更快速、准确和可扩展的数据处理任务。

7. JsonSerDe:

JsonSerDe是一种序列化/反序列化库,它用于将JSON格式的数据转换为可读取的结构化数据。与其他序列化/反序列化库不同,JsonSerDe可以将JSON格式的数据映射到Hive表的列,从而实现数据的快速查询和分析。

JsonSerDe优势:

JSON格式支持:JsonSerDe支持各种JSON格式,例如简单类型、数组类型和嵌套类型等,并且支持自定义数据类型的定义。

Hive表格集成:JsonSerDe可以将JSON格式的数据映射到Hive表的列,从而实现对结构化数据的快速查询和分析。

数据类型支持:JsonSerDe支持各种常见的数据类型,例如整数、浮点数、字符串、日期和时间戳等,并且还支持数组和嵌套结构等复杂数据类型。

压缩和编码:JsonSerDe支持多种压缩算法和编码方式,例如gzip、lzo和snappy等,这些方式可以有效地减小数据大小,提高数据传输和存储效率。

应用场景:JsonSerDe适用于需要处理JSON格式的数据,并且需要进行快速查询和分析的场景,例如Web日志、社交媒体和移动应用等领域。它可以帮助用户实现更快速、准确和可扩展的数据处理任务。

8.自定义SerDe

除了上述常见的 SerDe 之外,Hive 还支持自定义 SerDe,你可以根据自己的需要编写自己的 SerDe 来处理特定格式的数据。自定义 SerDe 可以通过实现 `org.apache.hadoop.hive.serde2.SerDe` 接口来实现。

总的来说,Hive SerDe 支持多种数据格式,你可以选择最适合你的数据格式的 SerDe 来处理数据。如果没有适合你的数据格式的 SerDe,你也可以编写自己的 SerDe 来处理数据。

三,应用案例

使用 SerDe 需要定义一个 Hive 表,并指定 SerDe 的名称和属性。例如,以下是一个使用 CSV 格式的 SerDe 的示例:

CREATE TABLE mytable (

id INT,

name STRING,

age INT

)

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'

WITH SERDEPROPERTIES (

'separatorChar' = ',',

'quoteChar' = '"',

'escapeChar' = '\\'

)

在上面的示例中,我们创建了一个名为 `mytable` 的 Hive 表,并将其定义为使用 `OpenCSVSerde` SerDe。我们还指定了 SerDe 的一些属性,例如分隔符、引号字符和转义字符。这些属性将告诉 SerDe 如何解析和处理数据。

在实际使用中,我们可以将数据加载到 Hive 表中,并使用 Hive SQL 对其进行查询和分析。例如,我们可以使用以下命令将 CSV 文件加载到 `mytable` 表中:

LOAD DATA LOCAL INPATH '/path/to/csv/file' INTO TABLE mytable

之后,我们可以使用 Hive SQL 对表中的数据进行查询和分析,例如:

SELECT name, age FROM mytable WHERE id = 1;

这将返回 `mytable` 表中 `id` 为 1 的行的 `name` 和 `age` 列的值。

总的来说,Hive SerDe 是 Hive 中非常重要的一个组件,它允许 Hive 与各种数据格式进行交互,并且可以定义数据的结构和模式。如果你需要在 Hive 中处理非标准数据格式,SerDe 可能是一个非常有用的工具。

四.spark3引擎下适合SerDe

Spark 3引擎文件SerDe是推荐Arrow SerDe。Arrow SerDe是一种基于内存的列式存储格式,它可以在不同的计算框架之间高效地传输数据。与其他SerDe库不同,Arrow SerDe使用统一的数据模型和内存布局来表示数据,在多个计算框架中具有良好的互操作性。

以下是Arrow SerDe的一些关键特点和优势:

高性能:Arrow SerDe采用内存映射方式进行数据传输和处理,避免了磁盘IO开销,并且对于大规模数据集的处理具有良好的扩展性。

跨语言支持:Arrow SerDe支持多种编程语言,例如Java、Python、C++等,这意味着可以跨越不同编程语言和平台进行数据交换,非常方便。

数据类型支持:Arrow SerDe支持各种常见的数据类型,例如整数、浮点数、字符串、日期和时间戳等,并且还支持数组和嵌套结构等复杂数据类型。

应用场景:Arrow SerDe适用于需要高效处理大规模数据集的场景,例如数据仓库、数据挖掘、日志分析等领域。它可以帮助用户实现更快速、准确和可扩展的数据处理任务。

参考文档:

DeveloperGuide - Apache Hive - Apache Software Foundation

serde_arrow - Rust

参考文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。