繁体   English   中英

从Spark-Scala UDF返回Seq [Row]

[英]Return Seq[Row] from Spark-Scala UDF

我在Scala中使用Spark进行一些数据处理。 我有XML数据映射到数据框。 我将Row作为参数传递给UDF,并尝试提取两个复杂类型的对象作为列表。 Spark给我以下错误:

线程“主”中的异常java.lang.UnsupportedOperationException:不支持org.apache.spark.sql.Row类型的架构

def testUdf = udf((testInput: Row) => {
  val firstObject = testInput.getAs[Row]("Object1")
  val secondObject = testInput.getAs[Row]("Object2")
  val returnObject = Seq[firstObject,secondObject]

  returnObject
})

你能告诉我我做错了吗。 谢谢。

UDF无法返回Row对象。 返回类型必须是数据类型表中Scala的值类型列中枚举的类型之一。

好消息是这里不需要UDF。 如果Object1Object2 具有相同的架构 (否则它将无法正常工作),则可以使用array函数:

import org.apache.spark.sql.functions._

df.select(array(col("Object1"), col("Object2"))

要么

df.select(array(col("path.to.Object1"), col("path.to.Object2"))

如果Object1Object2不是顶级列。

我想建议一种替代方法,如果object1和object2的架构不同,并且您可以返回该行,则可以使用该方法。 基本上要返回row,您只需返回一个具有Row对象架构的case类,在这种情况下,该对象是object1和object2,它们本身似乎是行

所以做以下

case class Object1(<add the schema here>)

case class Object2(<add the schema here>)

case class Record(object1:Object1,object2:Object2)

现在在UDF中,您可以使用firstObject和secondObject创建object1和object2

然后

val record = Record(object1,object2)

然后您可以返回record

即使架构不相同或需要某些处理,您也可以在其中返回行。

我知道这实际上与您的问题无关,但是这个问题似乎是一个正确的机会来介绍这个概念。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM