sql - 使用 scala 在 spark sql 中编写 UDF

标签 sql scala apache-spark apache-spark-sql

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

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

另外,我注意到带有分解选项的横向 View 。我认为这在理论上适用于我的情况,但对我不起作用。我认为这可能是因为我没有使用 HiveContext 但我无法更改它。

最佳答案

我从问题中得到的是首先你想在 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|
+--------+---------+--------------+

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

关于sql - 使用 scala 在 spark sql 中编写 UDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30511508/

相关文章:

scala - Play Framework 中指定的基础 docker 镜像在哪里?

mysql - 创建搜索查询

scala - Apache thrift 是否与 Scala 一起工作

c# - 在 DataView 的 RowFilter 中选择 DISTINCT

java - 在 Scala 中学习并发时出现 NullPointerException

java - 有没有办法只改变Spark中JavaPairRDD的值?

amazon-web-services - 如何从 shell 脚本中捕获 Spark 错误

python - PySpark:根据不同列中的一个值的最后一次出现来填充列

sql - 如何在 PostgreSQL 中使用循环序列执行排序

sql - 识别客户最近一天访问的第一页