SparkSQL的兩種UDAF的講解
2018年07月09日 00:07:35 Spark高級玩法 閱讀數:1477
版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/rlnLo2pNEfx9c/article/details/80972447
Spark的dataframe提供了通用的聚合方法,比如count(),countDistinct(),avg(),max(),min()等等。然而這些函數是針對dataframe設計的,當然sparksql也有類型安全的版本,java和scala語言接口都有,這些就適用於強類型Datasets。本文主要是講解spark提供的兩種聚合函數接口:
1, UserDefinedAggregateFunction
這兩個接口基本上滿足了,用戶自定義聚合函數的需求。
UserDefinedAggregateFunction
類UserDefinedAggregateFunction,在文件udaf.scala裏面。是實現用戶自定義聚合函數UDAF的基礎類,首先,我們先看看該類的基本信息
abstract class UserDefinedAggregateFunction extends Serializable { StructType代表的是該聚合函數輸入參數的類型。例如,一個UDAF實現需要兩個輸入參數, 類型分別是DoubleType和LongType,那麼該StructType格式如下: new StructType() .add("doubleInput",DoubleType) .add("LongType",LongType) 那麼該udaf就只會識別,這種類型的輸入的數據。 def inputSchema: StructType 該StructType代表aggregation buffer的類型參數。例如,一個udaf的buffer有 兩個值,類型分別是DoubleType和LongType,那麼其格式將會如下: new StructType() .add("doubleInput", DoubleType) .add("longInput", LongType) 也只會適用於類型格式如上的數據 def bufferSchema: StructType dataTypeda代表該UDAF的返回值類型 def dataType: DataType 如果該函數是確定性的,那麼將會返回true,例如,給相同的輸入,就會有相同 的輸出 def deterministic: Boolean 初始化聚合buffer,例如,給聚合buffer以0值 在兩個初始buffer調用聚合函數,其返回值應該是初始函數自身,例如 merge(initialBuffer,initialBuffer)應該等於initialBuffer。 def initialize(buffer: MutableAggregationBuffer): Unit 利用輸入輸入去更新給定的聚合buffer,每個輸入行都會調用一次該函數 def update(buffer: MutableAggregationBuffer, input: Row): Unit 合併兩個聚合buffer,並且將更新的buffer返回給buffer1 該函數在聚合並兩個部分聚合數據集的時候調用 def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit 計算該udaf在給定聚合buffer上的最終結果 def evaluate(buffer: Row): Any