spark udaf更新元组的元组类型

时间:2016-09-17 23:58:25

标签: arrays scala apache-spark aggregate-functions user-defined-functions

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

def bufferSchema = new StructType().add("midResults", ArrayType(  StructType(Array(StructField("a", DoubleType),StructField("b", DoubleType))) ))

def dataType: DataType = ArrayType(  StructType(Array(StructField( "a", DoubleType),StructField("b", DoubleType))) )

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

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 of Array ..

,这种模式有效

1 个答案:

答案 0 :(得分:3)

java.lang.ArrayStoreException"thrown to indicate that an attempt has been made to store the wrong type of object into an array of objects",预计because a local Scala type for StructType is o.a.s.sql.Row不是元组。换句话说,您应该使用Seq[Row]作为缓冲区域,并使用Row作为值。

备注

  • 在循环中调用++可能不是最好的想法。
  • 如果考虑到因为Spark 2.0 collect_list支持复杂类型,那么创建UDAF有点过时了。
  • 可以说AggregatorsUserDefinedAggregateFunctions更加用户友好。