[译]介绍Spark2.4的用于处理复杂数据类型的新内置函数与高阶函数

本文翻译自databricks的介绍spark2.4新特性的blog,英文原文参考原文链接

Apache Spark2.4总共支持了29个用于处理复杂数据类型(比如,数组类型等)的新内置函数和高阶函数。

在Spark2.4版本之前,有两种典型的方式处理复杂数据类型:

  1. 将嵌套结构的数据转化为多行数据,然后使用函数处理,最后再组装成嵌套结构。
  2. 自己构建一个UDF。

和之前不同,新的内置函数可以直接操作复杂数据类型,同时新的高阶函数可以使用匿名的lambda函数处理复杂数据类型,和UDF类似,但是性能大大提高。

在本篇文章,我们将通过一些示例展示部分内置函数以及它们的具体用法。

典型的处理方式

我们首先来看一下Spark2.4以前典型的处理方式。

选择1 - Explode and Collect

我们使用explode函数将数组数据拆解为多行数据然后计算val + 1,最后用collect_list再将多行数据重新组织成数组。

SELECT id,collect_list(val + 1) AS vals
FROM   (SELECT id,explode(vals) AS valFROM input_tbl) x
GROUP BY id

这种方式容易出错,同时效率也比较低,这主要体现在三个方面。首先我们很难去确保最后重组的数组所用的行数据确定来自原始的数组,需要通过对unique key分组来保证。其次,我们需要用到group by,这就意味之需要一次shuffle操作,但是shuffle操作并不保证重组后的数组和原始数组中数据的顺序一致。最后,这样的处理方式非常昂贵。

选择2 - User Defined Function

接下来,我们使用Scala UDF处理Seq[Int],访问序列中每个元素并加1.

def addOne(values: Seq[Int]): Seq[Int] = {values.map(value => value + 1)
}
val plusOneInt = spark.udf.register("plusOneInt", addOne(_: Seq[Int]): Seq[Int])

或者,我们也可以使用Python UDF。

SELECT id, plusOneInt(vals) as vals FROM input_tbl

这样更简单更快,同时也避免了很多可能导致错误的陷阱,但是由于还是需要将数据反序列化成Scala或者Python对象,仍然效率不高。
【译者注】基于Tungsten引擎,Spark SQL处理的中间数据是以binary的方式直接存储的,使用UDF需要将binary数据反序列化成Scala/Python数组,处理完成后,还需要序列化成binary数据。

你可以参考并尝试我们之前发布的一篇文章中notebook示例。

新内置函数

下面我们看看新内置函数是如何处理复杂数据类型的。这个notebook列举每个函数的示例。每个函数的名称和参数标注了它们对应处理的数据类型,T或U表示数组,K,V表示映射(MAP)类型。

高阶函数

【译者注】高阶函数是来自函数式语言的一个概念,主要是指一个函数支持使用其他函数作为参数或者返回类型为函数。具体定义可以参考Higher-Order Function
为了更进一步处理数组和映射类型的数据,我们使用了匿名lambda函数或高阶函数这两种SQL中支持的语法,使用lambda函数作为入参。

lambda函数的语法规范如下:

 argument -> function body(argument1, argument2, ...) -> function body

箭头->左边表示参数列表,箭头右边定义函数体,在函数体中使用参数和其他成员变量计算结果值。

使用匿名Lambda函数

我们首先尝试使用匿名lambda函数的transform函数。

假设有一个表,包含三列数据:integer类型的key,integer数组类型的values,二维Integer数组类型的nested_values。

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

当我们执行如下SQL的时候:

SELECT TRANSFORM(values, element -> element + 1) FROM data;

transform函数迭代访问values数组中的每个元素,并执行lambda函数,给每个元素加1,然后构建一个新数组。

我们可以使用除了参数以外的其他变量,比如:key,key是表中的另外一列,在lambda函数上下文之外,但是我们仍然可以使用它,比如:

SELECT TRANSFORM(values, element -> element + key) FROM data;

如果你想要处理更复杂的嵌套类型,比如nested_values列的数据,你甚至可以使用嵌套的lambda函数:

SELECT TRANSFORM(nested_values,arr -> TRANSFORM(arr,element -> element + key + SIZE(arr)))FROM data;

在里层的lambda函数中,你同样也可以使用key和arr这些在lambda函数上下文之外的变量以及表的其他字段值。

需要注意的是,在上面的notebook中,同时展示了基于之前典型的处理方式和新的高阶函数的处理方式两种示例代码,

结论

Spark2.4支持了24个新的内置函数,比如array_union, array_max/min等,以及5个高阶函数,比如transform, filter等,都是用于处理复杂数据类型。如果你需要处理复杂数据类型,建议使用这些函数。感谢Apache Spark的contributor贡献了这些功能:Alex Vayda, Bruce Robbins, Dylan Guedes, Florent Pepin, H Lu, Huaxin Gao, Kazuaki Ishizaki, Marco Gaido, Marek Novotny, Neha Patil, Sandeep Singh以及其他人。

欢迎加群指正交流

[译]介绍Spark2.4的用于处理复杂数据类型的新内置函数与高阶函数相关推荐

  1. Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍

    参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...

  2. [译]Effective Kotlin系列之探索高阶函数中inline修饰符(三)

    简述: 不知道是否有小伙伴还记得我们之前的Effective Kotlin翻译系列,之前一直忙于赶时髦研究Kotlin 1.3中的新特性.把此系列耽搁了,赶完时髦了还是得踏实探究本质和基础,从今天开始 ...

  3. 总结Vue第一天~简单介绍、基本知识、辅助函数和js数组的高阶函数

    目录 vue中文官网 一.简单介绍: (1)vue.js :本质就是一个js 核心类库[跟咱使用的其他组件插件而安装他们]: ■ 安装方式: (2)小demo了解一下vue.js: (3)响应式: 二 ...

  4. 豆瓣读书练习-介绍filter高阶函数

    豆瓣读书练习 如上数据有问题如下: • 索引无序 • 单价中包含各种各样单位 所以需求如下: • 读取数据 重置索引 • 将单价列取出 整数 或 浮点数 并转为可计算类型 • 将评分列进行降序 • 直 ...

  5. python高阶函数、map reduce 自己如何去定义_「python」高阶函数map、reduce的介绍

    Python map 先看官方介绍: map(function, iterable, ...)Return an iterator that applies function to every ite ...

  6. mysql用于检索的关键字,通过MySQL内置全文检索实现中文的相关检索 | 浩然东方...

    原文作者: walker 整理日期: 2007-02-08 关键字:MySQL 全文检索 全文索引 中文分词 二元分词 区位码 相似度 /** * @author : walkerlee * @cop ...

  7. python functools模块(主要是为函数式编程而设计,用于增强函数功能,主要为可调用对象(callable objects)定义高阶函数或操作)

    参考文章1:Python的functools模块 参考文章2:尝试修改LabelImg,将以对顶角画框改成以对角线相交点画框

  8. python高阶函数介绍_python高级特性和高阶函数及使用详解

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  9. NLP(9): 机器学习介绍,朴素贝叶斯,python高阶函数应用

    第一节:机器学习 D={X,y} x:特征 y:标签 f:学习x到y的映射关系 1.机器学习定义: 自动从已有的数据里找出一些规律(与专家系统的区别),然后把学到的这些规律应用到对未来数据的预测值,或 ...

最新文章

  1. Interview:算法岗位面试—10.31下午上海某银行总部公司(二面,四大行之一)之项目简介、比赛介绍、某个比赛的过程
  2. docker 使用中遇到的问题
  3. Jpeg图像转yuv 16倍数问题(第一季)
  4. STM32F103C8T6 硬件SPI+DMA 控制WS2811
  5. 人工智能 ppt_我体验了下人工智能PPT制作平台,这6个功能让我惊喜!
  6. linux下texlive的卸载,linux下安装TexLive
  7. Sparkling Logic决策引擎操作手册
  8. 数据挖掘期末大作业附加题
  9. dvdscr是什么意思?什么是dvdscr格式?
  10. rpx 和 rem 详解
  11. GlobalSign 发布了即将要修改代码签名证书的重要通知
  12. 卡梅 计算机生物专业怎么样,【智友学子】X同学----卡耐基梅隆大学 计算生物学...
  13. Linux系统管理---权限管理
  14. VS2015许可证过期
  15. 将PostgreSQL插件移植到openGauss指导
  16. 项目经理该怎样做好项目质量管理工作?
  17. 【数据库系统概念第七版(Database System Concepts 7th)配套SQL文件如何获取】
  18. 个税继续教育证书有哪些 计算机,个税专项附加扣除中继续教育哪些证书可以扣除呢?...
  19. java微信发送验证码,详解如何使用微信小程序云函数发送短信验证码
  20. 矩阵分析——Jordan标准形

热门文章

  1. 【SQL 提示 之二】index_ss Index Skip Hint
  2. Oracle Database 中 B*Tree 索引内部维护
  3. 你是码农还是Geek?
  4. 【My Sft】彩色图像分析软件V1.0.1.0
  5. EVEREST Ultimate Edition 4.50 Build 1330 Final
  6. H3C模拟器里的F1060防火墙如何开启WEB界面
  7. Oracle与MySQL使用区别
  8. Win10系列:JavaScript动画3
  9. 腾讯安全上海游戏部门笔试题
  10. php阳历转阴历(农历),阴历转阳历的方法