Spark UDF函數

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

2,Aggregator

這兩個接口基本上滿足了,用戶自定義聚合函數的需求。

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


  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章