Spark 2.4 让你飞一般的处理复杂数据类型

栏目: 服务器 · 发布时间: 5年前

内容简介:我们都知道,在spark2.4 之前,处理复杂数据类型是一件比较痛苦的事情,有两种比较恶心的处理方式在 spark2.4 之后,你就轻松了,可以使用多种内嵌函数处理复杂类型,对 array 或者 map类型的列处理起来很easy, 如果满足不了你的需求,你可以直接在sql中写lambda 表达式,怎么用,怎么爽。

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

Spark 2.4 让你飞一般的处理复杂数据类型

spark 2.4 之前的写法是:

Spark 2.4 让你飞一般的处理复杂数据类型

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

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

Spark 2.4 让你飞一般的处理复杂数据类型

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

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

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

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

key values nested_values
1 [1, 2, 3] [[1, 2, 3], [], [4, 5]]

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

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

Spark 2.4 让你飞一般的处理复杂数据类型

2 性能好在哪里

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

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

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

Spark 2.4 让你飞一般的处理复杂数据类型

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

Spark 2.4 让你飞一般的处理复杂数据类型

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

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

Spark 2.4 让你飞一般的处理复杂数据类型

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

大家都在看

关注 【spark技术分享】

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

Spark 2.4 让你飞一般的处理复杂数据类型

听说新版微信这有个好看


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

码农翻身

码农翻身

刘欣 / 电子工业出版社 / 2018-6-1 / 69.00元

《码农翻身》用故事的方式讲解了软件编程的若干重要领域,侧重于基础性、原理性的知识。 《码农翻身》分为6章。第1章讲述计算机的基础知识;第2章侧重讲解Java的基础知识;第3章偏重Web后端编程;第4章讲解代码管理的本质;第5章讲述了JavaScript的历史、Node.js的原理、程序的链接、命令式和声明式编程的区别,以及作者十多年来使用各种编程语言的感受;第6章是作者的经验总结和心得体会,......一起来看看 《码农翻身》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器