Hive SerDe 序列化和反序列序列化表

news/2024/3/29 19:18:28/文章来源:https://blog.csdn.net/weixin_42011858/article/details/129254135

一、SerDe的概念

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

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

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

二、序列化与反序列化的过程

Serializer序列化:数据行对象(Row object)—> 序列化 —> OutputFileFormate —> HDFS 文件
Deserializer反序列化:HDFS 文件 —> InputFileFormate —> 反序列化 —> 数据行对象(Row object)

三、Hive 的 SerDe 分类

1,内置 SerDe 类型

Hive 读写 HDFS 文件的 FileFormat 类型:

(1)TextInputFormat/HiveIgnoreKeyTextOutputFormat
读写文本文件格式的数据。

(2)SequenceFileInputFormat/SequenceFileOutputFormat
读写 Hadoop 的序列文件格式。

Hive 序列化和反序列化数据的SerDe 类:

(1)MetadataTypedColumnsetSerDe
用于读写以某个分隔符分隔的记录。比如使用逗号分隔符的记录(CSV),tab 键分隔符的记录。

(2)LazySimpleSerDe
默认的 SerDe 类型。读取与 MetadataTypedColumnsetSerDe 和 TCTLSeparatedProtocol 相同的数据格式,可以用这个 Hive SerDe 类型。它是以惰性的方式创建对象的,因此具有更好的性能。在 Hive 0.14.0 版本以后,在读写数据时它支持指定字符编码。
示例:

ALTER TABLE person SET SERDEPROPERTIES (‘serialization.encoding’=’GBK’)
如果把配置属性 hive.lazysimple.extended_boolean_literal 设置为 true(Hive 0.14.0 以后版本),LazySimpleSerDe 可以把 ‘T’, ‘t’, ‘F’, ‘f’,1, and0’ 视为合法的布尔字面量。而该配置默认是 false 的,因此它只会把 ‘True’ 和 ‘False’ 视为合法的布尔字面量。

(3)Thrift SerDe
读写 Thrift 序列化对象,可以使用这种 Hive SerDe 类型。需要确定的是,对于 Thrift 对象,类文件必须先被加载。

(4)动态 SerDe
为了读写 Thrift 序列化对象,我们可以使用这种 SerDe 类型。它可以理解 Thrift DDL 语句,所以对象的模式可以在运行时被提供。另外,它支持许多不同的协议,包括 TBinaryProtocol, TJSONProtocol, TCTLSeparatedProtocol。

2,自定义 SerDe 类型

如果 Hive 的自定义 Serde 类型不能满足你的需求,你可以自己定义自己的 SerDe 类型。

(1)定义一个类

定义一个类, 继承抽象类 AbstractSerDe, 实现 initialize 和 deserialize 两个方法。
示例代码如下:

package com.coder4.hive;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.serde.Constants;
import org.apache.hadoop.hive.serde2.AbstractSerDe;
import org.apache.hadoop.hive.serde2.SerDeException;
import org.apache.hadoop.hive.serde2.SerDeStats;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
public class MySerDe extends AbstractSerDe {// paramsprivate List<String> columnNames = null;private List<TypeInfo> columnTypes = null;private ObjectInspector objectInspector = null;// seperatorprivate String nullString = null;private String lineSep = null;private String kvSep = null;@Overridepublic void initialize(Configuration conf, Properties tbl)throws SerDeException {// Read seplineSep = "\n";kvSep = "=";nullString = tbl.getProperty(Constants.SERIALIZATION_NULL_FORMAT, "");// Read Column NamesString columnNameProp = tbl.getProperty(Constants.LIST_COLUMNS);if (columnNameProp != null && columnNameProp.length() > 0) {columnNames = Arrays.asList(columnNameProp.split(","));} else {columnNames = new ArrayList<String>();}// Read Column TypesString columnTypeProp = tbl.getProperty(Constants.LIST_COLUMN_TYPES);// default all stringif (columnTypeProp == null) {String[] types = new String[columnNames.size()];Arrays.fill(types, 0, types.length, Constants.STRING_TYPE_NAME);columnTypeProp = StringUtils.join(types, ":");}columnTypes = TypeInfoUtils.getTypeInfosFromTypeString(columnTypeProp);// Check column and types equalsif (columnTypes.size() != columnNames.size()) {throw new SerDeException("len(columnNames) != len(columntTypes)");}// Create ObjectInspectors from the type information for each columnList<ObjectInspector> columnOIs = new ArrayList<ObjectInspector>();ObjectInspector oi;for (int c = 0; c < columnNames.size(); c++) {oi = TypeInfoUtils.getStandardJavaObjectInspectorFromTypeInfo(columnTypes.get(c));columnOIs.add(oi);}objectInspector = ObjectInspectorFactory.getStandardStructObjectInspector(columnNames, columnOIs);}@Overridepublic Object deserialize(Writable wr) throws SerDeException {// Split to kv pairif (wr == null)return null;Map<String, String> kvMap = new HashMap<String, String>();Text text = (Text) wr;for (String kv : text.toString().split(lineSep)) {String[] pair = kv.split(kvSep);if (pair.length == 2) {kvMap.put(pair[0], pair[1]);}}// Set according to col_names and col_typesArrayList<Object> row = new ArrayList<Object>();String colName = null;TypeInfo type_info = null;Object obj = null;for (int i = 0; i < columnNames.size(); i++) {colName = columnNames.get(i);type_info = columnTypes.get(i);obj = null;if (type_info.getCategory() == ObjectInspector.Category.PRIMITIVE) {PrimitiveTypeInfo p_type_info = (PrimitiveTypeInfo) type_info;switch (p_type_info.getPrimitiveCategory()) {case STRING:obj = StringUtils.defaultString(kvMap.get(colName), "");break;case LONG:case INT:try {obj = Long.parseLong(kvMap.get(colName));} catch (Exception e) {}}}row.add(obj);}return row;}@Overridepublic ObjectInspector getObjectInspector() throws SerDeException {return objectInspector;}@Overridepublic SerDeStats getSerDeStats() {return null;}@Overridepublic Class<? extends Writable> getSerializedClass() {return Text.class;}@Overridepublic Writable serialize(Object arg0, ObjectInspector arg1)throws SerDeException {return null;}
}

(2)使用自定义 Serde 类型

hive > add jar MySerDe.jar

创建表格时属性 row fromat 指定自定义的 SerDe 类。

CREATE EXTERNAL TABLE IF NOT EXISTS teacher ( id BIGINT, name STRING,age INT)
ROW FORMAT SERDE 'com.coder4.hive.MySerDe'
STORED AS TEXTFILE
LOCATION '/usr/hive/text/'

文章参考:https://www.hadoopdoc.com/hive/hive-serde

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

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

相关文章

跟对象介绍十个常用的 Python 内置函数,她夸了我一整天

内置函数是什么 了解内置函数之前&#xff0c;先来了解一下什么是函数 将使用频繁的代码段进行封装&#xff0c;并给它起一个名字&#xff0c;当我们使用的时候只需要知道名字就行 函数就是一段封装好的、可以重复使用的代码&#xff0c;函数使得我们的程序更加简洁、模块化&a…

Goframe快速创建项目,并使用Cli工具创建dao、service、logic

GoFrame项目创建与Cli工具创建1.项目创建2.Mysql数据库配置3.Cli工具dao自动生成4.业务模型须知5.Cli工具service/logic自动生成 - 接口6.Controller/Api创建1.项目创建 官网 - 项目创建-init 开发文档 - 目录介绍 官网 - 示例项目 1.gf init 项目名 &#xff08;创建项目…

Java及JVM简介

世界上没有最好的编程语言&#xff0c;只有最适用于具体应用场景的编程语言 懂得JVM内部的内存结构、工作机制&#xff0c;是设计高扩展性应用和诊断运行时问题的基础&#xff0c;也是Java工程师进阶的必备能力。 java介绍 java是目前应用最为广泛的软件开发平台之一。随着…

C++---最长上升子序列模型---登山(每日一道算法2023.2.28)

注意事项&#xff1a; 本题为"线性dp—最长上升子序列的长度" 和 “最长上升子序列模型—怪盗基德的滑翔翼” 的扩展题&#xff0c;所以dp思路这里就不再赘述。 题目&#xff1a; 五一到了&#xff0c;ACM队组织大家去登山观光&#xff0c;队员们发现山上一共有N个景…

复习知识点八之数组

目录 数组 静态初始化练习 打印 索引 数组遍历 练习1:遍历数组并求和 练习2:统计个数 练习3:变化数据​编辑 数组的动态初始化 数组的动态初始化和静态初始化的区别​编辑 数组的常见问题 数组常见操作 练习1:求最值 ​编辑 练习2 : 遍历数组求和 练习3: 练习4: 数…

值得收藏!适合小微企业的万元数字化攻略!

编者按&#xff1a;小微企业数字化之路困难重重&#xff1f;看看这款全新的全面数字化方案&#xff0c;低成本、部署效率、免安装、免维护、数据安全&#xff0c;小微企业的数字化福音&#xff01;关键词&#xff1a;低成本&#xff0c;开箱即用&#xff0c;免安装免维护&#…

SpringMVC使用 redis 实现缓存

简介 SpringMVC 中也可以将缓存标签和 redis 结合起来使用&#xff0c;其实此时缓存没有起作用&#xff0c;只是通过缓存的那几个注解来操作 redis 而已&#xff1b;SpringMVC 中整合 redis 比较麻烦的是注意版本冲突的问题&#xff0c;如下是官网有关于版本的要求 https://d…

I.MX6ULL内核开发12:使用设备树插件实现RGB灯驱动

目录 一、引言 二、设备树插件格式 三、实验说明 四、实验准备 4.1 通过内核工具编译设备树插件 五、实验效果 5.1 uboot加载 5.2 加载RGB驱动 一、引言 Linux4.4以后引入了动态设备树&#xff08;Dynamic DevicesTree&#xff09;&#xff0c;这里翻译位“设备树插件…

银行软件测试面试题目总结,希望可以帮到你

目录 一、根据题目要求写出具体LINUX操作命令 二、JMETER题目 三、根据题目要求写出具体SQL语句 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、根据题目要求写出具体LINUX操作命令 1、分别写出一种…

SpringMVC源码:HandlerMapping加载1

参考资料&#xff1a; 《SpringMVC源码解析系列》 《SpringMVC源码分析》 《Spring MVC源码》 写在开头&#xff1a;本文为个人学习笔记&#xff0c;内容比较随意&#xff0c;夹杂个人理解&#xff0c;如有错误&#xff0c;欢迎指正。 前文&#xff1a; 《SpringMVC源码&a…

跨设备文件传输工具横评

文章目录对比QQ微信SnapDropLocalSendIntelUnisonLANDropTailscaleAirDroidSendAnywhere参考文献对比 传输速度测试条件大致相同&#xff0c;文件大小约为 100 MB 工具优点缺点传输速度备注QQ支持断点续传不要求同一局域网需要安装1.81 MB/s微信方便需要安装不支持大文件传完还…

ROS1学习笔记:ROS中的坐标管理系统(ubuntu20.04)

参考B站古月居ROS入门21讲&#xff1a;ROS中的坐标系管理系统 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录一、机器人中的坐标变换二、TF功能包三、小海龟跟随实验3.1 启动实验3.2 查看当前的TF树3.3 坐标相对位置可视化3.3.1 tf_echo3.3.2 rviz一、机器人中的坐标变换…

15个Spring扩展点,一般人知道的不超过5个!

Spring的核心思想就是容器&#xff0c;当容器refresh的时候&#xff0c;外部看上去风平浪静&#xff0c;其实内部则是一片惊涛骇浪&#xff0c;汪洋一片。Spring Boot更是封装了Spring&#xff0c;遵循约定大于配置&#xff0c;加上自动装配的机制。很多时候我们只要引用了一个…

Maven高级操作,别说你不知道

如果文章对你有帮助欢迎【关注❤️❤️❤️点赞&#x1f44d;&#x1f44d;&#x1f44d;收藏⭐⭐⭐】一键三连&#xff01;一起努力&#xff01; &#x1f916; 一、聚合 &#x1f47b; 1、作用&#xff1a; 用于快速构建maven工程&#xff0c;一次性构建多个模块/项目 &am…

【人脸识别】DDL:数据分布知识蒸馏思想,提升困难样本(遮挡、低分辨率等)识别效果

论文题目&#xff1a;《Improving Face Recognition from Hard Samples via Distribution Distillation Loss》 论文地址&#xff1a;https://arxiv.org/pdf/2002.03662v3.pdf 代码地址&#xff1a;https://github.com/HuangYG123/DDL 1.前言及相关工作 Large facial variatio…

阿里前端二面常考react面试题(必备)

说说 React组件开发中关于作用域的常见问题。 在 EMAScript5语法规范中&#xff0c;关于作用域的常见问题如下。 &#xff08;1&#xff09;在map等方法的回调函数中&#xff0c;要绑定作用域this&#xff08;通过bind方法&#xff09;。 &#xff08;2&#xff09;父组件传递…

华为OD机试模拟题 用 C++ 实现 - 最左侧冗余覆盖子串(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明最左侧冗余覆盖子串题目输入输出示例一输入输出说明示例二输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写…

HCIP-5距离矢量路由协议RIP学习笔记

前言 路由信息协议RIP&#xff08;Routing Information Protocol&#xff09;的简称&#xff0c;它是一种基于距离矢量&#xff08;Distance-Vector&#xff09;算法的协议&#xff0c;使用跳数作为度量来衡量到达目的网络的距离。RIP主要应用于规模较小的网络中。Rip是第一个动…

RK3568平台开发系列讲解(驱动基础篇)SMP(Symmetrical Multi-Processing)

🚀返回专栏总目录 文章目录 一、linux SMP 和 AMP二、linux SMP的启动流程三、CPU的描述:cpumask四、CPU之间的关系沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 SMP(Symmetrical Multi-Processing)。 一、linux SMP 和 AMP 目前支持多核处理器的实时操…

QT学习14:QtXlsx操作Excel表

一、前言操作excel方式有&#xff1a;QAxObject 和QtXlsx区别&#xff1a;Qt自带的QAxObject库操作excel的前提是电脑已经安装微软的Office&#xff08;包含EXCEL&#xff09;&#xff0c;而QtXlsx可以直接使用免装Office且操作更简单。二、QtXlsx操作示例参考&#xff1a;http…