大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结

embedded/2024/11/22 23:10:25/

点一下关注吧!!!非常感谢!!持续更新!!!

Java篇开始了!

目前开始更新 MyBatis,一起深入浅出!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(已更完)
  • Elasticsearch(已更完)
  • DataX(已更完)
  • Tez(已更完)
  • 数据挖掘(已更完)
  • Prometheus(已更完)
  • Grafana(已更完)
  • 离线数仓(正在更新…)

章节内容

上节我们完成了如下的内容:

  • ODS层的构建 Hive处理
  • JSON 数据处理 结构化

在这里插入图片描述

JSON 数据处理

续接上节,上节到了内建函数。

使用UDF处理

自定义UDF处理JSON串中的数组,自定义UDF函数:

  • 输入:JSON串、数组的Key
  • 输出:字符串数组

UDF(User Defined Function)

UDF 是用户定义的函数,用于扩展大数据处理系统的功能。通过 UDF,用户可以实现特定的业务逻辑,用于数据的转换或计算。

UDF 的特点

  • 扩展性:Hive 等工具提供内置函数,但 UDF 允许用户实现自定义逻辑,满足复杂需求。
  • 灵活性:UDF 可以用多种编程语言实现(Java、Python 等)。

多种类型:

  • 普通 UDF:用于单行输入的计算,返回一个值。
  • UDAF(User Defined Aggregation Function):用户定义的聚合函数,处理多行数据并返回单个结果。
  • UDTF(User Defined Table-generating Function):用户定义的表生成函数,处理单行输入并输出多行数据。

导入依赖

<dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>2.3.7</version><scope>provided</scope>
</dependency>

编写代码

java">package icu.wzk;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.parquet.Strings;import java.util.ArrayList;public class ParseJsonArray extends UDF {public ArrayList<String> evaluate(String jsonStr, String arrKey) {if (Strings.isNullOrEmpty(jsonStr)) {return null;}try {JSONObject object = JSON.parseObject(jsonStr);JSONArray jsonArray = object.getJSONArray(arrKey);ArrayList<String> result = new ArrayList<>();for (Object o : jsonArray) {result.add(o.toString());}return result;} catch (JSONException e) {return null;}}}

打包代码

mvn clean package;

上传:“hive-parse-json-array-1.0-SNAPSHOT-jar-with-dependencies.jar”文件到指定的目录下。

测试函数

使用自定义UDF函数:

sql">-- 启动hive
-- 添加自定义的jar包
add jar /opt/wzk/hive-parse-json-array-1.0-SNAPSHOT-jar-with-dependencies.jar;-- 创建临时函数,指定类需要完整的路径
CREATE temporary function wzk_json_array AS "icu.wzk.ParseJsonArray";

执行结果如下图所示:
在这里插入图片描述
运行函数进行解析:

-- 执行查询进行测试
SELECTusername, age, sex, wzk_json_array(json, "ids") ids
FROM jsont1;

运行结果如下图所示:
在这里插入图片描述

sql">-- 解析json串中的数组,并展开
SELECTusername, age, sex, ids1
FROM jsont1
lateral view explode(wzk_json_array(json, "ids")) t1 AS ids1;

运行结果如下图所示:
在这里插入图片描述

sql">-- 解析json串中的数组,并展开
SELECTusername, age, sex, ids1, id, num
FROM jsont1
lateral view explode(wzk_json_array(json, "ids")) t1 AS ids1
lateral view json_tuple(json, 'id', 'total_number') t1 AS id, num;

运行结果如下图所示:

在这里插入图片描述

使用SerDe处理

SerDe(Serializer and Deserializer)

SerDe 是序列化与反序列化的缩写,用于定义数据的读写方式。在大数据框架中,数据通常以结构化或非结构化形式存储,SerDe 用于将这些数据转化为系统可以理解的格式,或从系统中导出成所需格式。

SerDe 的作用

  • 反序列化:将存储中的字节流(例如文件)解析成 Hive 表中的行数据。
  • 序列化:将 Hive 表中的行数据转换为存储格式(如 JSON、CSV、Avro 等)。
  • 支持自定义数据格式:当 Hive 的内置格式不满足需求时,可以编写自定义 SerDe。

基本信息

序列化是对象转换为字节序列的过程,反序列化是字节序列恢复为对象的过程,对象的序列化主要有两种用途:

  • 对象的序列化,即把对象转换为字节序列后保存到文件中
  • 对象数据的网络传送

SerDe是Serializer和Deserilizer的简写形式,Hive使用Serde进行行对象的序列化与反序列化,最后实现把文件内容映射到Hive表中的字段数据类型。SerDe包括Serialize、Deserilize两个功能:

  • Serializa把Hive使用的JavaObject转换成能写入HDFS字节序列,或者其他系统能识别的流文件
  • Deserilize把字符串或者二进制流转换成Hive能识别的JavaObject对象

Read:HDFS Files => InputFileFormat => <Key, Value> => Deserializer => Row Object
Write: Row Object => Serializer => <Key, Value> => OutputFormat => HDFS files

Hive本身自带了几个内置的SerDe,还有其他一些第三方的SerDe可供选择。

sql">CREATE TABLE t11(id string)
stored AS parquet;CREATE TABLE t12(id string)
stored AS ORC;DESC formatted t11;
DESC formatted t12;

创建数据

对于纯JSON格式的数据,可以使用JsonSerDe来处理:

vim /opt/wzk/json2.dat

写入内容如下所示:

{"id": 1,"ids": [101,102,103],"total_number": 3}
{"id": 2,"ids": [201,202,203,204],"total_number": 4}
{"id": 3,"ids": [301,302,303,304,305],"total_number": 5}
{"id": 4,"ids": [401,402,403,304],"total_number": 5}
{"id": 5,"ids": [501,502,503],"total_number": 3}

写入的数据如下所示:
在这里插入图片描述

进行测试

我们先启动Hive

hive

然后执行SQL进行测试:

sql">-- 创建表数据
CREATE TABLE jsont2(id int,ids array<string>,total_number int
) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe';-- 加载数据
load data local inpath '/opt/wzk/json2.dat' into
table jsont2;

执行结果如下图所示:
在这里插入图片描述

最后小结

各种JSON格式处理的小结:

  • 简单格式的JSON数据,使用 get_json_object、json_tuple处理
  • 对于嵌套数据类型,可以使用UDF
  • 纯JSON串可使用JsonSerDe处理更简单

http://www.ppmy.cn/embedded/139730.html

相关文章

药方新解:Spring Boot中药实验管理系统设计

3系统分析 3.1可行性分析 通过对本中药实验管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本中药实验管理系统采用SSM框架&#xff0c;JAVA作为开发语…

Swift内存访问冲突

内存的访问&#xff0c;发生在给变量赋值的时候&#xff0c;或者传递值&#xff08;给函数&#xff09;的时候&#xff0c;例如 var one 1//向one的内存区域发起一次写的操作 print("\(one)")//向one的内存区域发起一次读的操作 在 Swift 里&#xff0c;有很多修改…

pycharm复现github项目代码问题记录

目录 1.anaconda下载问题2.创建项目虚拟环境---在Anaconda Prompt中或在pycharm终端里3.conda安装与卸载4.镜像源附录 1.anaconda下载问题 按照教程下载后&#xff0c;配置的环境全部保存在了C盘&#xff0c;导致C盘爆满&#xff1a; 按照如下进行修改&#xff0c;将环境地址放…

多目标优化算法:多目标蛇鹫优化算法(MOSBOA)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码

一、蛇鹫优化算法 蛇鹫优化算法&#xff08;Secretary Bird Optimization Algorithm&#xff0c;简称SBOA&#xff09;由Youfa Fu等人于2024年4月发表在《Artificial Intelligence Review》期刊上的一种新型的元启发式算法。该算法旨在解决复杂工程优化问题&#xff0c;特别是…

跨平台编译Go程序:GOOS和GOARCH环境变量的使用

在Go语言开发中&#xff0c;我们经常需要为不同的操作系统和处理器架构编译程序。Go语言提供了两个环境变量GOOS和GOARCH&#xff0c;允许我们轻松地为不同的目标平台编译代码。本文将介绍如何使用这两个环境变量来编译适用于不同平台和架构的Go程序。 1. 理解GOOS和GOARCH G…

Spring Boot汽车资讯:速度与信息的融合

3系统分析 3.1可行性分析 通过对本汽车资讯网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本汽车资讯网站采用SSM框架&#xff0c;JAVA作为开发语言&#…

基于Java实现的(GUI)飞机大战小游戏

摘要 本课程设计通过代码实现将理论知识和具体实践相结合&#xff0c;巩固提高了对JAVA的相关方法与概念的理解&#xff0c;进一步加强了学生的发散思维及动手能力&#xff0c;加强了学生对计算机及软件工程的进一步了解。 在这个课程设计中&#xff0c;使用类、抽象类和接口…

Spark RDD 中的 repartition 和 coalesce 是两种常用的分区调整算子的异同点

Spark RDD 中的 repartition 和 coalesce 是两种常用的分区调整算子&#xff0c;它们的功能是改变 RDD 的分区数量。以下从源码、原理和使用角度分析它们的异同点。 一、repartition 和 coalesce 的功能与区别 特性repartitioncoalesce主要功能调整 RDD 分区数量&#xff0c;可…