文档章节

Spark UDTF 与 输出多列的UDF小笔记

问津已非少年
 问津已非少年
发布于 2017/07/21 16:56
字数 704
阅读 369
收藏 0

前言

对于UDF和UDAF相比大家并不陌生,用起来也都很顺手,在此就不多做介绍了~

通常我们的UDF都是一个或多个输入,然后一个输出。如果想要使用多个输出,比如像1.6版本里的json_tuple这样 :

df.select(json_tuple(col("jsonField"), "Field1", "Field2").as(Seq("Field1", "Field2")))

这种输出方式可以直接输出多列,同时 explode 也是类似的,这一类Spark内置函数称为 UDTF 也即 User Defined Table-generation Function,函数的输入是一个或多个列值,输出是一个table

不过Spark目前并未提供我们自己实现UDTF的方法,所以目前的使用还仅限于Spark内置的几个UDTF,想要达到多列输出,我们需要略作变通

使用Seq做返回类型,输出的多列是一个数组

def test: (String => Seq[String]) = aa => Seq("aa", aa, "cc")

这时候 udf(test) 的返回类型就是 ArrayType ,通过Column的getItem方法,我们可以取数得到多列

val testUDF = udf(test)
df.select(testUDF(col("testCol")).as("testUDFCol"))
  .select(col("testUDFCol").getItem(0).as("col1"),
    col("testUDFCol").getItem(1).as("col2"))

使用元组或case class做返回类型

case class Test(id: String, name: String)
def test: (String => Test) = aa => Test("1", aa)

// 使用元组做返回类型
def test: (String => (String, String)) = aa => ("1", aa)

当使用元组或case class做函数返回类型时,UDF的返回类型就是StructType,通过Column的getField方法,我们可以取数得到多列

val testUDF = udf(test)
df.select(testUDF(col("testCol")).as("testUDFCol"))
  .select(col("testUDFCol").getField("id").as("col1"),
    col("testUDFCol").getField("name").as("col2"))

// 使用元组的时候取值
df.select(testUDF(col("testCol")).as("testUDFCol"))
  .select(col("testUDFCol").getField("_1").as("col1"),
    col("testUDFCol").getField("_2").as("col2"))

使用Map作为返回类型

def test: (String => Map[String, String]) = aa => Map("id" -> "1", "name" -> aa)

对于Map类型,UDF的返回类型是MapType,也是通过Column的getField方法,我们可以取数得到多列

val testUDF = udf(test)
df.select(testUDF(col("testCol")).as("testUDFCol"))
  .select(col("testUDFCol").getField("id").as("col1"),
    col("testUDFCol").getField("name").as("col2"))

最后

想说的是,这种变通方式好像跟输出多列的UDF这个标题扯得有点远了,其实并没有输出多列,只是换一个类型而已,但问题由此引起,也就以此为题啦~~

另外,显然使用case class这种方式更好,因为返回类型有多种,更适合实际项目需要~~

© 著作权归作者所有

共有 人打赏支持
问津已非少年
粉丝 17
博文 21
码字总数 33944
作品 0
海淀
程序员
私信 提问
Apache Hivemall 0.5.2 发布,可扩展的机器学习库

Apache Hivemall 0.5.2 发布了,Apache Hivemall 基于 Hive UDF/UDAF/UDTF,是一个可扩展的机器学习库,运行基于 Hadoop 的数据处理框架,特别是 Apache Hive、Apache Spark 和 Apache Pig。...

h4cd
12/11
0
0
Apache Spark 2.4 正式发布,重要功能详细介绍

美国时间 2018年11月08日 正式发布了。一如既往,为了继续实现 Spark 更快,更轻松,更智能的目标,Spark 2.4 带来了许多新功能,如下: 添加一种支持屏障模式(barrier mode)的调度器,以便...

Spark
11/10
0
0
Apache Spark 2.4.0 正式发布

Apache Spark 2.4 与昨天正式发布,Apache Spark 2.4 版本是 2.x 系列的第五个版本。 如果想及时了解 Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号: itebloghadoop Apache Spa...

Spark
11/09
0
0
Apache Zeppelin 0.6.2 发布

Apache Zeppelin 0.6.2 发布了,更新内容如下: 改进 Spark interpreter binary is compatibile with Spark 1.6/Scala 2.10 and Spark 2.0/Scala 2.11 without rebuild Note storage aware ......

局长
2016/10/18
1K
1
Spark2.x写入Elasticsearch的性能测试

一、Spark集成ElasticSearch的设计动机 ElasticSearch 毫秒级的查询响应时间还是很惊艳的。其优点有: 1. 优秀的全文检索能力 2. 高效的列式存储与查询能力 3. 数据分布式存储(Shard 分片) 相...

openfea
2017/10/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Framework7开发H5App如何禁止回退离开首页

将代码放到需要禁止回退的页面即可 主要代码 $(function () {  //防止页面后退  history.pushState(null, null, document.URL);     window.addEventListener('popstate', funct...

老查
2分钟前
0
0
Navicat使用教程(三):使用MySQL日志(第3部分)——慢速日志

下载Navicat for MySQL最新版本 Navicat for MySQL 是一套管理和开发 MySQL 或 MariaDB 的理想解决方案。使用Navicat for MySQL可以同时连接到 MySQL 和 MariaDB。Navicat for MySQL提供了强...

电池盒
7分钟前
0
0
威武 | 有我在,HTTPS更安全!亚洲诚信参展FIT 2019

12月12日-12月13日,备受瞩目的FIT 2019在上海宝华万豪酒店隆重举行。作为FreeBuf互联网安全创新大会(FIT)的长期战略合作伙伴,亚洲诚信受邀参加本次盛会,并与来自全球的行业先锋们聚焦前...

亚洲诚信
10分钟前
0
0
提高 JavaScript 开发效率的高级 VSCode 扩展!

摘要: VScode越来越火了啊。 原文:提高 JavaScript 开发效率的高级 VSCode 扩展! 作者:前端小智 Fundebug经授权转载,版权归原作者所有。 Quokka.js Quokka.js 是一个用于 JavaScript 和...

Fundebug
11分钟前
0
0
docker development note

// on developer clientsudo route -n add -net 172.17.0.0/16 192.168.99.100// on test docker serversudo iptables -A FORWARD -j ACCEPT...

kut
11分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部