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

 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android双击图片放大移动图中双击点到ImageView区域中心,Kotlin

Android双击图片放大移动图中双击点到ImageView区域中心&#xff0c;Kotlin 初始化状态&#xff0c;ImageView里面只是显示一张fitcenter被缩放的原图&#xff0c;当手指在图片上双击后&#xff08;记录双击点位置&#xff1a;mCurX&#xff0c;mCurY&#xff09;画一个红色小圆…

【Linux的权限命令详解】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 shell命令以及运行原理 Linux权限的概念 Linux权限管理 一、什么是权限&#xff1f; 二、权限的本质 三、Linux中的用户 四、linux中文件的权限 4.1、文件访问…

基于SpringBoot Vue高校失物招领系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

Django(八)

1. 管理员操作 1.1 添加 from django.shortcuts import render, redirectfrom app01 import models from app01.utils.pagination import Paginationfrom django import forms from django.core.exceptions import ValidationError from app01.utils.bootstrap import BootStr…

(学习日记)2024.01.19

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

2635. 转换数组中的每个元素

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 编写一个函数&#xff0c;这个函数接收一个整数数组 arr 和一个映射函数 fn &#xff0c;通…

基于ssm+vue的宠物医院系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

GitHub提交 / 拉取时 443 fatal: unable to access ‘https:

这个问题嘛 懂得都懂 但是用了魔法后依旧会出现443错误 排查了工具发现并不是工具的问题 修改一下git代理即可解决 解决方法如下 确保魔法可用的情况下 打开魔法 打开系统设置 > 网络和Internet > 代理 找到自己的代理IP 如下 这里以我的代理IP和端口举例 在…

js变量提升

js变量提升 在JavaScript中&#xff0c;变量提升&#xff08;Hoisting&#xff09;是一种特殊的语法行为&#xff0c;它允许变量和函数声明在它们实际出现之前被JavaScript引擎识别。这意味着&#xff0c;当你在代码的后面部分使用一个变量或函数时&#xff0c;JavaScript引擎…

【每日一题】2788. 按分隔符拆分字符串-2024.1.20

题目&#xff1a; 2788. 按分隔符拆分字符串 给你一个字符串数组 words 和一个字符 separator &#xff0c;请你按 separator 拆分 words 中的每个字符串。 返回一个由拆分后的新字符串组成的字符串数组&#xff0c;不包括空字符串 。 注意 separator 用于决定拆分发生的位…

六个顶级的Python可视化项目

如果你是Python可视化的新手&#xff0c;一些流行的可视化库包括Matplotlib、Seaborn、Plotly、Bokeh、Altair和Folium&#xff0c;以及大量的库和例子可能会让你感到不知所措。 当可视化一个DataFrame时&#xff0c;选择使用哪个可视化库确实是一个头疼的事情。 这篇文章云朵…

输出一个水仙花数

思路&#xff1a; 1.对当前数字i&#xff0c;进行拆解 2.获得百位、十位、个位 3.判断每位立方之和是否等于原数字i package com.ztt.Demo02Exercise;public class test04 {/** 水仙花数*/public static void main(String[] args) {daffodilNumber();}public static void daffo…

pyqt5写一个图形化的文本处理软件

参考资料https://www.zhihu.com/column/pyqt5 最终效果软件 导入安装包 pip install PyQt5 -i https://pypi.douban.com/simple pip install PyQt5-tools -i https://pypi.douban.com/simple要使用PyQt5编写一个文本处理程序&#xff0c;你可以按照以下步骤进行&#xff1a…

【C语言】linux内核ipoib模块 - ipoib_send

一、ipoib_send函数定义 int ipoib_send(struct net_device *dev, struct sk_buff *skb,struct ib_ah *address, u32 dqpn) {struct ipoib_dev_priv *priv ipoib_priv(dev);struct ipoib_tx_buf *tx_req;int hlen, rc;void *phead;unsigned int usable_sge priv->max_sen…

图片验证码+短信验证码

图片验证码短信验证码 图片验证码短信验证码 图片验证码 在调用接口的时候&#xff0c;只要触发了这个接口&#xff0c;就要换验证码(无论成功与否) if (!redisDao.deleteKey(phKey)) {throw new CustomException("验证码错误");}短信验证码 在短信验证的时候&…

基于python socket实现TCP/UDP通信

两个应用程序如果需要进行通讯最基本的一个前提就是能够唯一的标示一个进程&#xff0c;我们知道IP层的ip地址可以唯一标示主机&#xff0c;而TCP层协议和端口号可以唯一标示主机的一个进程&#xff0c;这样我们可以利用ip地址&#xff0b;协议&#xff0b;端口号唯一标示网络中…

Kotlin 同步与异步执行:run、runCatching、runBlocking 与 runInterruptible

前言 首先&#xff0c;run 和 runCatching 是同步的&#xff0c;而 runBlocking 和 runInterruptible 是异步的。 run 和 runCatching 是 Kotlin 标准库的一部分&#xff0c;可以在所有支持的平台上使用。 runBlocking 和 runInterruptible 是 Coroutines 的一部分。 一、run…

使用 crypto-js 进行 AES 加解密操作

在前端开发中&#xff0c;数据的加密和解密是为了保障用户隐私和数据的安全性而常见的任务。AES&#xff08;Advanced Encryption Standard&#xff09;是一种对称密钥加密算法&#xff0c;被广泛用于保护敏感信息的传输和存储。本文将介绍 AES 加解密的基本原理&#xff0c;并…

寒假思维训练计划day11

每日一题&#xff0c;这两天有事&#xff0c;断更了一天&#xff0c;今天补上&#xff0c;感觉状态也不太好&#xff0c;来道1500的题压压惊。 宣传一下我总结的几个构造题模型&#xff0c;一点个人的浅薄见解&#xff1a; 1、前后缀贪心&#xff0c;比如说观察前后缀的sum&…

解决el-radio-group只触发一次的问题

1.需求是点击合并后&#xff0c;出来二次确认框。现在的问题是点击完出现二次确认框后&#xff0c;再次点击不出来二次确认框了 2.一开始代码是这样写的 <el-radio-group v-model"unfold" size"mini" changechangeMerge><el-radio-button :labe…