[英]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。 如果Object1
和Object2
具有相同的架构 (否则它将无法正常工作),则可以使用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"))
如果Object1
和Object2
不是顶级列。
我想建议一种替代方法,如果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.