flink-自定义聚合函数

定义

自定义聚合函数(UDAF),将多条记录聚合成1条记录。其输入与输出是多对一的关系,即将多条输入记录聚合成一条输出值。
详情可查看:https://nightlies.apache.org/flink/flink-docs-master/docs/dev/table/functions/udfs/#aggregate-functions

函数注册

增加依赖:

<dependencies>

   <dependency>

     <groupId>org.apache.flink</groupId>

    <artifactId>flink-table-common</artifactId>

    <version>1.12.7</version>

     <scope>provided</scope>

  </dependency>

</dependencies>

代码示例:  

package com.flink;

import org.apache.flink.table.functions.AggregateFunction;

import java.util.Iterator;

public class ASI_UDAF {
public static class AccSum {
public long sum;
}

public static class MySum extends AggregateFunction<Long, AccSum> {

@Override
public Long getValue(AccSum acSum) {
return acSum.sum;
}

@Override
public AccSum createAccumulator() {
AccSum acCount = new AccSum();
acCount.sum = 0;
return acCount;
}

public void accumulate(AccSum acc, long num) {
acc.sum += num;
}

/**
* Support retract a msg generated by upstream operator.
*/
public void retract(AccSum acc, long num) {
acc.sum -= num;
}

/**
* Support local-global two stage aggregate optimization.
*/
public void merge(AccSum acc, Iterable<AccSum> it) {
Iterator<AccSum> iter = it.iterator();
while (iter.hasNext()) {
AccSum accSum = iter.next();
if (null != accSum) {
acc.sum += accSum.sum;
}
}
}
}
}

函数应用示例

CREATE TEMPORARY TABLE ASI_UDAF_Source (
  a BIGINT NOT NULL
) WITH (
  'connector' = 'datagen'
);

CREATE TEMPORARY TABLE ASI_UDAF_Sink (
  a  BIGINT
) WITH (
  'connector' = 'print'
);

INSERT INTO ASI_UDAF_Sink
SELECT `ASI_UDAF$MySum`(a) FROM ASI_UDAF_Source;
posted @ 2023-07-28 10:37  梦呓空间  阅读(38)  评论(0编辑  收藏  举报