pgsql处理文档类型数据_spark 2.4让你飞一般的处理复杂数据类型

spark 2.4 对复杂数据处理类型引入了 29 个内嵌函数,文档参考 https://docs.databricks.com/_static/notebooks/apache-spark-2.4-functions.html,里面包含一些 higher-order 函数,就跟scala 里面的 map filter reduce 一样,让你在sql中也可以享受函数式编程的快感。

我们都知道,在spark2.4 之前,处理复杂数据类型是一件比较痛苦的事情,有两种比较恶心的处理方式

  •  使用 explod 表达式把嵌套数据类型平展开,应用你自己的处理逻辑,再用 collect_list 表达式在拼凑起来,

  • 自定义一个 udf 函数处理多层嵌套的数据类型

在 spark2.4 之后,你就轻松了,可以使用多种内嵌函数处理复杂类型,对 array 或者 map类型的列处理起来很easy, 如果满足不了你的需求,你可以直接在sql中写lambda 表达式,怎么用,怎么爽。

1 匿名lambda函数使用姿势

下面举个例子说明下:

假如我们有这样一个 dataframe, 有两列,vals 列是个数组,我们的需求是对数组中的多个元素都 +1

9043fb52267703c5decfc5f140725b92.png

spark 2.4 之前的写法是:

d9271f8ad4cb4e33a22580247ae208b6.png

这样会有几个问题, 如果有两个 id 为1的行,平展开在组合后的结果就只有一行了,这就错了,而且带着 group by 肯定就涉及到 shuffle 操作了,性能会下降,而且shuffle 操作不保证数据元素的顺序,有可能数组元素顺序就变了。

另外一种写法是自定义一个UDF:

5d26cb885e3f3daf2c584926b54c3a93.png

58c3d9d107ab43b481fc51222fa7cbb8.png

这种用法正确性倒是没有问题, 但是会损失性能,下文中会进行详细分析。

如果我们使用 spark2.4 提供的  higher-order 函数, 里面定义一个匿名lambda函数,就轻松了:

b16ca89ff63bc6b7ad3d5c9657430ea8.png

这个 transform 函数会遍历数组,然后应用你定义的匿名lambda函数,是不是很简单。

下面我举个复杂一些的例子:

keyvaluesnested_values
1[1, 2, 3][[1, 2, 3], [], [4, 5]]

 如果我们想对数组中的每个元素都加上同一行的key,sql可以写成这样:

1a74c7c8e5f8f3e2c578b57e60961a90.png如果你需要处理多层嵌套的数据类型,比如我们例子中的nested_values,没关系,你直接写一个两层的匿名lambda函数 就可以了:

96d75777b7d0743f69efb915b078f511.png

2 性能好在哪里

有人就问了,这种在 sql 中写 匿名lambda函数 就是轻便了一些,和 自定义一个 udf 到底有什么差距,其实我今天就是想重点探讨一下这个问题

其实两者的差距就在于直接写lambda函数不需要序列化和反序列化, udf 需要,你想呀,如果对每条数据都要进行序列化和反序列化, 对于海量数据,性能必定有很大的损失。

对于 tansform 处理一个数组,spark2.4 内部会创建一个 tansform 类型的表达式节点

59ad04041e218be73a3c663ec417f97b.png

这个节点对数组的处理流程如下,需要注意的是,spark 会使用 encoder 把加载的数据,或者jvm对象转换为一种内部的数组字节格式 InternalRow,这种不同于java 序列化,虽然都是把对象转换为字节数组,但是表达式生成的代码可以直接操作字节数组,而不需要反序列化,这种字节数组格式大大提高了处理时间效率和空间效率。

ba92001f4ce0de206dfaa727a9f240e6.png

arrayTransform 表达式会遍历数组,然后应用你定义的匿名lamdba 函数,最后更新相应的元素。

下面我们来看下 udf 方式的处理方式:

84b558e31a869113bef661fb5c2cf17e.png

看到没有,中间处理过程中,需要先把catalyst类型(也就是  InternalRow 格式) 格式转换为 scala 类型, 然后应用自定义函数,然后再转回去,多了一次序列化和反序列化的性能损耗,所以如果在海量数据下,这种性能损失还是很大的。

大家都在看

spark sql源码系列:

是时候学习真正的spark技术了 丨 从0到1认识 spark sql 丨 spark sql 源码剖析 PushDownPredicate  丨 spark sql 源码剖析 OptimizeIn 篇

structured streaming 系列:

structured streaming 原理剖析  丨 structured streaming 碰上kafka 丨structured streaming 是如何搞定乱序时间的

spark streaming 系列:

spark streaming 读取kafka各种姿势详解  丨 spark streaming流式计算中的困境与解决之道 

spark core 系列:

彻底搞懂spark shuffle过程(1) 丨 彻底搞懂spark shuffle过程(2)  丨spark内存管理-Tungsten框架探秘

spark 机器学习系列

关注【spark技术分享】

一起撸spark源码,一起玩spark最佳实践

ef0ddd29e4b1e6996372beb1a3ab1fc2.gif

听说新版微信这有个好看
PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,现在已经更名为PostgreSQL. PostgreSQL支持大部分SQL标准并且提供了许多其它现代特性:复杂查询、外键、触发器、视图、事务完整性等。 PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。 事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。 本课程作为PostgreSQL数据库管理之三,主要讲解以下内容:1.     PostgreSQL约束讲解和剖析2.     PostgreSQL数据类型3.     PostgreSQL的结构管理4.     PostgreSQL条件表达式和操作5.     PostgreSQL使用小技巧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值