用scala在spark sql中编写UDF

use*_*624 2 sql scala apache-spark apache-spark-sql

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

我见过的例子通常包括传入一个字符串,转换它,然后输出一些我成功完成的其他对象的转换字符串.但是如果想要传入一个实际上是某种Spark SQL Row对象的输入,或者一个Row对象列表,每个对象都有键值对的字段,等等.在我的情况下,我正在通过在Row对象列表中,通过告诉UDF输入是List [Map [String,Any]].我认为问题部分是因为它实际上是某种GenericRowWithSchema对象而不是List或Array.

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

ags*_*hin 6

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

定义UDF

def compare(r:Row) = {r.get(0)==r.get(1)} 
Run Code Online (Sandbox Code Playgroud)

注册UDF

sqlContext.udf.register("compare", compare _)
Run Code Online (Sandbox Code Playgroud)

创建dataFrame

val TestDoc = sqlContext.createDataFrame(Seq(("sachin", "sachin"), ("aggarwal", "aggarwal1"))).toDF("text", "text2")
Run Code Online (Sandbox Code Playgroud)

使用UDF

scala> TestDoc.select($"text", $"text2",callUdf("compare",struct($"text",$"text2")).as("comparedOutput")).show
Run Code Online (Sandbox Code Playgroud)

结果:

+--------+---------+--------------+
|    text|    text2|comparedOutput|
+--------+---------+--------------+
|  sachin|   sachin|          true|
|aggarwal|aggarwal1|         false|
+--------+---------+--------------+
Run Code Online (Sandbox Code Playgroud)

第二个问题是关于具有爆炸选项的LATERAL VIEW,更好地使用HiveContext