【问题标题】:writing a UDF in spark sql with scala使用 scala 在 spark sql 中编写 UDF
【发布时间】: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 没有任何问题。您可以发布您正在尝试的实际代码吗?
  • 问题是你想要达到什么目的。您的问题很难理解(和回答)

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


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-09-16
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2017-09-22
    • 2019-03-06
    • 2019-01-25
    相关资源
    最近更新 更多