使用 scala 在 spark sql 中编写 UDF

Posted

技术标签:

【中文标题】使用 scala 在 spark sql 中编写 UDF【英文标题】:writing a UDF in spark sql with scala 【发布时间】:2015-05-28 15:53:59 【问题描述】:

我正在使用 spark SQL 编写 UDF,我想知道是否有一个地方可以阅读有关在这方面什么是不可能的文档?还是教程?我使用的是 SQLContext,而不是 HiveContext。

我看到的示例通常涉及传入一个字符串,对其进行转换,然后输出一些我已经成功完成的其他对象的转换字符串。但是,如果一个人想要传入一个实际上是某种 Spark SQL Row 对象的输入,即,或者一个 Row 对象列表,每个对象都有带有键值对的字段等。在我的情况下,我正在传递通过告诉 UDF 输入是 List[Map[String, Any]] 在行对象列表中。我认为问题的部分原因在于它实际上是某种 GenericRowWithSchema 对象,而不是列表或数组。

另外,我注意到带有爆炸选项的 LATERAL VIEW。我认为这在理论上适用于我的情况,但它对我不起作用。我认为这可能是因为我没有使用 HiveContext 但我无法改变它。

【问题讨论】:

我从未使用过 HiveContext,并且使用explode 创建LATERAL VIEW 没有任何问题。您可以发布您正在尝试的实际代码吗? 问题是你想要达到什么目的。您的问题很难理解(和回答) 【参考方案1】:

我从问题中得到的是首先你想在 UDF 中读取一行

定义 UDF

def compare(r:Row) = r.get(0)==r.get(1) 

注册 UDF

sqlContext.udf.register("compare", compare _)

创建数据帧

val TestDoc = sqlContext.createDataFrame(Seq(("sachin", "sachin"), ("aggarwal", "aggarwal1"))).toDF("text", "text2")

使用 UDF

scala> TestDoc.select($"text", $"text2",callUdf("compare",struct($"text",$"text2")).as("comparedOutput")).show

结果:

+--------+---------+--------------+
|    text|    text2|comparedOutput|
+--------+---------+--------------+
|  sachin|   sachin|          true|
|aggarwal|aggarwal1|         false|
+--------+---------+--------------+

第二个问题是关于带爆炸选项的 LATERAL VIEW,最好使用 HiveContext

【讨论】:

以上是关于使用 scala 在 spark sql 中编写 UDF的主要内容,如果未能解决你的问题,请参考以下文章

将 spark.sql 查询转换为 spark/scala 查询

如何在 Scala 中使用 Spark SQL 返回多个 JSON 对象

在 spark sql 中注册 UDAF

在scala中使用spark sql解决特定需求

三万字,Spark学习笔记

在 spark scala 中为 withcolumn 编写通用函数