Arrays spark udaf更新元组的数组类型

Arrays spark udaf更新元组的数组类型,arrays,scala,apache-spark,aggregate-functions,user-defined-functions,Arrays,Scala,Apache Spark,Aggregate Functions,User Defined Functions,我正在使用Scala+Spark 2.0并尝试编写一个UDAF,其中包含一个元组数组作为其内部缓冲区以及返回类型: 这就是我更新缓冲区的方法 def update(buffer: MutableAggregationBuffer, input: Row) = { buffer(0) = buffer.getAs[mutable.WrappedArray[(Double,Double)]](3) ++ Array((3.0,4.0)) } 但我有以下例外: java.lang.ArraySto

我正在使用Scala+Spark 2.0并尝试编写一个UDAF,其中包含一个元组数组作为其内部缓冲区以及返回类型:

这就是我更新缓冲区的方法

def update(buffer: MutableAggregationBuffer, input: Row) = {
buffer(0) = buffer.getAs[mutable.WrappedArray[(Double,Double)]](3) ++ Array((3.0,4.0))
}
但我有以下例外:

java.lang.ArrayStoreException: org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema

如果我有一个Double.lang.ArrayStoreException的简单数组,则此模式可以工作,而这不是一个元组。换句话说,您应该使用
Seq[Row]
作为缓冲区字段,使用
Row
作为值

注释

  • 在循环中调用
    ++
    可能不是最好的主意
  • 如果考虑到SCAP 2 <代码> CopeTeCistBue/COD>支持复杂类型,则创建UDAF稍微过时。
  • 可以说,它们比
    用户定义的聚合函数
    更加用户友好

我不确定它是否同意在这种情况下尝试存储一行,但我肯定会切换到收集列表和聚合器(我同意UDAF有点笨重)。谢谢你的提示。有点轻描淡写:)
Aggregators
仍然非常冗长,但编写起来要愉快得多。关于行,您不能有类型为
TupleN
的架构。这里的反射只有一种作用。所以缓冲区应该包含
Seq[Row]
,函数应该期望
Rows
作为输入。在尝试了这个示例之后,我遇到了一个问题,即如何找到automagic编码器。我添加了“导入sparkSession.implicits.”任何其他指针?
聚合器
?请记住,API在1.6和2.0之间发生了变化。我这里有一个完整的2.0示例。当然,您应该首先将
DataFrame
转换为一些静态类型的数据集。否则您将不得不处理行编码器:。我不明白这如何解决在缓冲区中使用元组的问题。。。
java.lang.ArrayStoreException: org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema