Hive建表时候用的参数及其含义

发布时间:2024年01月18日

?1.序列化与反序列化

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

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

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

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

读写行数据流程如下:
- 读

HDFS files --> InputFileFormat --> <key, value> --> Deserializer --> Row object
- 写

Row object --> Serializer --> <key, value> --> OutputFileFormat --> HDFS files

ALTER TABLE my_table 
SET SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SERDEPROPERTIES (
    "serialization.format" = ",",
    "field.delim" = ","
);

field.delim是表的两个列字段之间的文件中的字段分隔符.

其中serialization.format是文件序列化时表中两个列字段之间的文件中的字段分隔符.

其中LazySimpleSerDe还可以替换为:

1.LazyBinarySerDe,其中前者是用于把数据进行二进制序列化的,LazyBinarySerDe可以延迟解析数据,避免了大量解析无关数据的开销,提高了处理效率。

2.ColumnarSerDe

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

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

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

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适用于需要高度灵活和可扩展的数据处理场景,例如大规模数据集成、流式数据处理等领域。它可以帮助用户实现更快速、准确和可扩展的数据处理任务。

5.

JsonSerDe

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

6.

ParquetHiveSerDe

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

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

2.STORED AS

????????其中的可选参数中STORED AS就是表中的存储格式,例如如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。也就是存储的方式是啥

1、textfile

默认格式;

存储方式为行存储;

磁盘开销大 数据解析开销大;

使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作

2、sequencefile

二进制文件,以<key,value>的形式序列化到文件中;
存储方式:行存储;
可分割 压缩;
一般选择block压缩;
优势是文件和Hadoop api中的mapfile是相互兼容的

3、refile

存储方式:数据按行分块,每块按照列存储;
压缩快 快速列存取;
读记录尽量涉及到的block最少;
读取需要的列只需要读取每个row group 的头部定义;
读取全量数据的操作 性能可能比sequencefile没有明显的优势。

4、orcfile

存储方式:数据按行分块,每块按照列存储;

压缩快 快速列存取;

效率比rcfile高,是rcfile的改良版本。

5、parquet

类似于orc,相对于orc文件格式,hadoop生态系统中大部分工程都支持parquet文件。

三、主流方式对比(TEXTFILE 、ORC、PARQUET三者的对比)

所谓的存储格式就是在Hive建表的时候指定的将表中的数据按照什么样子的存储方式,如果指定了A方式,那么在向表中插入数据的时候,将会使用该方式向HDFS中添加相应的数据类型。例如TEXTFILE 、SEQUENCEFILE、ORC、PARQUET这四种存储,前面两种是行式存储,后面两种是列式存储。
如果为textfile的文件格式,直接load就OK,不需要走MapReduce;如果是其他的类型就需要走MapReduce了,因为其他的类型都涉及到了文件的压缩,这需要借助MapReduce的压缩方式来实现。
?

PS:行存储和列存储的区别

行存储的特点: 查询满足条件的一整行数据的时候,行存储只需要找到其中一个值,其余的值都在相邻地方。列存储则需要去每个聚集的字段找到对应的每个列的值,所以此时行存储查询的速度更快。

列存储的特点: 因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。

TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的;
ORC和PARQUET是基于列式存储的。

ps:2为什么要有不同的存储形式为什么hive会有多种存储格式?因为hive是文本批处理系统,所以就存在一个往hive中导入数据的问题,首先数据的存储格式有多种,比如数据源是二进制格式, 普通文本格式等等,而hive强大之处不要求数据转换成特定的格式,而是利用hadoop本身InputFormat API来从不同的数据源读取数据,同样地使用OutputFormat API将数据写成不同的格式。所以对于不同的数据源,或者写出不同的格式就需要不同的对应的InputFormat和Outputformat

ps:3后面要牵扯到一个东西会内部表和外部表(extenal)所以介绍一下内部表和外部表的概念和异同

这个时候就要理解什么是外部表,通常我们会用到的MySQL,Oracle这种都是内部表,外部表就例如Hive这种,下面是一些具体区别:

??? 定义位置:内部表是在数据库内部定义和存储的,而外部表是在数据库外部定义和存储的。

??? 存储位置:内部表的数据存储在数据库的数据文件中,而外部表的数据通常存储在独立的文件系统或外部数据源中,如操作系统的文件系统、分布式文件系统、Hadoop等。

??? 数据访问:内部表的数据可以直接由数据库管理系统进行读取和处理,而外部表需要通过数据库连接器或外部数据源的接口进行访问和操作。

??? 数据管理:内部表的数据由数据库管理系统负责管理,包括数据的存储、索引、事务处理等,而外部表的数据管理通常由外部数据源自身负责。

??? 数据更新:内部表的数据可以进行插入、更新和删除等操作,而外部表通常只能进行查询操作,对其进行的修改操作可能需要通过外部数据源的接口或工具来实现。

??? 数据一致性:内部表的数据与数据库的事务一致性保持同步,而外部表的数据可能不与数据库的事务一致,因为外部数据源可能由其他系统或应用程序维护。

??? 数据集成:内部表的数据可以与数据库中的其他表进行关联和集成,进行复杂的查询和分析,而外部表需要通过数据导入或数据抽取等方式将外部数据与内部数据进行集成。

ps:4分区和分桶

因为hive表是整个表都检测的整个表,扫描的,所以可能存储太多了,要进行一些分区(特别注意在partitioned的时候呢不能把表中有的数据放进去,也挺好理解的),分区分多了,可能一个分区的数据也会特别多,所以要在分区了进一步的分桶。

EXTERNAL

? EXTERNAL 关键字可以让用户创建一个外部表,默认是内部表。外部表在建表的必须同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。

CLUSTERED BY

文章来源:https://blog.csdn.net/qq_52310720/article/details/135673229
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。