我自定義一個spark sql的函式,中間值產生的是陣列,但是設定中間型別為ArrayType會報紅

把ArrayType該父類DataType不報紅,但是運行報錯

難道不可以產生的中間型別為Array嗎?求大神解答,感謝!!!
下面是全部代碼
class GameDuration(startDayLong: Long, endDayLong: Long) extends UserDefinedAggregateFunction {
//輸入的資料型別
override def inputSchema: StructType = StructType(
StructField("eventType", IntegerType) ::
StructField("timestamp", LongType) :: Nil
)
//產生的中間結果型別
override def bufferSchema: StructType = StructType(
StructField("list", ArrayType) :: Nil
)
//最侄訓傳的結果型別
override def dataType: DataType = LongType
override def deterministic: Boolean = true
//指定初始值
override def initialize(buffer: MutableAggregationBuffer): Unit = {
buffer(1) = ArrayBuffer[Long]()
}
//每有一條資料參與運算就更新一下中間結果(update相當于在每一個磁區中的運算)
override def update(buffer: MutableAggregationBuffer, input: Row): Unit = {
val eventType = input.getInt(0)
val timestamp = input.getLong(1)
var tmp = 0L
if (eventType == 3) tmp = timestamp
else tmp = -timestamp
buffer(1) = buffer.getAs[ArrayBuffer[Long]](1) += tmp
}
//全域聚合
override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = {
buffer1(0) = buffer1.getInt(0) + buffer2.getInt(0)
}
//最終計算
override def evaluate(buffer: Row): Long = {
val arr: ArrayBuffer[Long] = buffer.getAs[ArrayBuffer[Long]](1)
if(arr(0) > 0) arr += -startDayLong
if(arr.last < 0) arr += endDayLong
arr.sum
}
}
還有這是我呼叫該函式,不知道是否正確啊
uj5u.com熱心網友回復:
求大神啊,,沒人嗎
uj5u.com熱心網友回復:
有人嗎?大神們快出來啊
uj5u.com熱心網友回復:
大神門救救我啊uj5u.com熱心網友回復:
ArrayType 要給引數def bufferSchema: StructType = StructType(StructField("linksTemp", ArrayType(StringType, true)) :: Nil)
org.apache.spark.sql.types.ArrayType 是這個包下的ArrayType,別參考錯了
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/58912.html
標籤:Spark
上一篇:深入淺出JUC并發編程
