我正在使用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 ..
,这种模式有效答案 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
作为值。
备注强>:
++
可能不是最好的想法。collect_list
支持复杂类型,那么创建UDAF有点过时了。Aggregators
比UserDefinedAggregateFunctions
更加用户友好。