我正在用 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/