flink 聚合函数代码研究

1、lag的FIX的代码: LeadLagAggFunction. 可以写sql测试代码。

 

/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/runtime/stream/sql/OverWindowITCase.scala

 @Test
  def testProcTimeBoundedPartitionedRowsOver2(): Unit = {
    val t = failingDataSource(TestData.tupleData5)
        .toTable(tEnv, 'a, 'b, 'c, 'd, 'e, 'proctime.proctime)
    tEnv.registerTable("MyTable", t)

    val sqlQuery =  "SELECT a, b, lead(b, 2, 3) over (partition by a order by b), lag(b, 1, 3) over (partition " +
        "by a order by b) FROM MyTable ";

    val sink = new TestingAppendSink
    tEnv.sqlQuery(sqlQuery).toAppendStream[Row].addSink(sink)

    env.execute()
    println( sink.getAppendResults.sorted)
  }

 

 

2、单元测试代码:

OverWindowITCase.scala 可以查询相关测试

 

@Test
  def testLagFunc(): Unit = {
    checkResult(
      "SELECT a, b, lag(b, 2, 3) over (partition by a order by b) FROM Table6",
      Seq(
        row(1, 1.1, 3.0),
        row(5, -5.9, 3.0),
        row(5, -2.8, 3.0),
        row(5, 0.7, -5.9),
        row(5, 2.71, -2.8),
        row(5, 3.9, 0.7),
        row(4, 3.14, 3.0),
        row(4, 3.14, 3.0),
        row(4, 3.15, 3.14),
        row(4, 3.16, 3.14),
        row(2, -2.4, 3.0),
        row(2, 2.5, 3.0),
        row(3, -9.77, 3.0),
        row(3, 0.0, 3.0),
        row(3, 0.08, -9.77)))

    checkResult(
      "SELECT a, b, lag(b, -2, 3) over (partition by a order by b) FROM Table6",
      Seq(
        row(1, 1.1, 3.0),
        row(5, -5.9, 0.7),
        row(5, -2.8, 2.71),
        row(5, 0.7, 3.9),
        row(5, 2.71, 3.0),
        row(5, 3.9, 3.0),
        row(4, 3.14, 3.15),
        row(4, 3.14, 3.16),
        row(4, 3.15, 3.0),
        row(4, 3.16, 3.0),
        row(2, -2.4, 3.0),
        row(2, 2.5, 3.0),
        row(3, -9.77, 0.08),
        row(3, 0.0, 3.0),
        row(3, 0.08, 3.0)))

    checkResult(
      "SELECT a, b, lag(b, -2, b) over (partition by a order by b) FROM Table6",
      Seq(
        row(1, 1.1, 1.1),
        row(5, -5.9, 0.7),
        row(5, -2.8, 2.71),
        row(5, 0.7, 3.9),
        row(5, 2.71, 2.71),
        row(5, 3.9, 3.9),
        row(4, 3.14, 3.15),
        row(4, 3.14, 3.16),
        row(4, 3.15, 3.15),
        row(4, 3.16, 3.16),
        row(2, -2.4, -2.4),
        row(2, 2.5, 2.5),
        row(3, -9.77, 0.08),
        row(3, 0.0, 0.0),
        row(3, 0.08, 0.08)))

    checkResult(
      "SELECT a, b, lag(b, a, 3) over (partition by a order by b) FROM Table6",
      Seq(
        row(1, 1.1, 3.0),
        row(5, -5.9, 3.0),
        row(5, -2.8, 3.0),
        row(5, 0.7, 3.0),
        row(5, 2.71, 3.0),
        row(5, 3.9, 3.0),
        row(4, 3.14, 3.0),
        row(4, 3.14, 3.0),
        row(4, 3.15, 3.0),
        row(4, 3.16, 3.0),
        row(2, -2.4, 3.0),
        row(2, 2.5, 3.0),
        row(3, -9.77, 3.0),
        row(3, 0.0, 3.0),
        row(3, 0.08, 3.0)))

    checkResult(
      "SELECT a-1, b, lag(b, a-1, 3) over (partition by a order by b) FROM Table6",
      Seq(
        row(0, 1.1, 1.1),
        row(4, -5.9, 3.0),
        row(4, -2.8, 3.0),
        row(4, 0.7, 3.0),
        row(4, 2.71, 3.0),
        row(4, 3.9, -5.9),
        row(3, 3.14, 3.0),
        row(3, 3.14, 3.0),
        row(3, 3.15, 3.0),
        row(3, 3.16, 3.14),
        row(1, -2.4, 3.0),
        row(1, 2.5, -2.4),
        row(2, -9.77, 3.0),
        row(2, 0.0, 3.0),
        row(2, 0.08, -9.77)))
  }

 

好的,下面是一个 Flink 有状态函数的示例代码: ``` public class MyStatefulFunction extends RichMapFunction<String, String> { private ValueState<Integer> countState; @Override public void open(Configuration config) { ValueStateDescriptor<Integer> descriptor = new ValueStateDescriptor<>( "countState", TypeInformation.of(new TypeHint<Integer>() {}), 0); countState = getRuntimeContext().getState(descriptor); } @Override public String map(String value) throws Exception { Integer count = countState.value(); count++; countState.update(count); return "Current count: " + count; } } ``` 在这个示例中,我们创建了一个 `MyStatefulFunction` 类,它继承了 Flink 的 `RichMapFunction` 类。`RichMapFunction` 是一个可富化的 Map 函数,它支持在函数的生命周期内创建状态并访问上下文信息。 在 `open()` 方法中,我们创建了一个 `ValueStateDescriptor` 对象,它描述了我们要创建的状态的名称、类型和默认值。然后,我们通过 `getRuntimeContext().getState(descriptor)` 方法获取了一个 `ValueState` 对象,它代表了我们创建的状态。 在 `map()` 方法中,我们从状态中读取当前计数值,然后将其加 1 并更新状态。最后,我们返回一个字符串,它包含了当前计数值。 这个示例展示了如何创建一个有状态的函数,并在函数的生命周期内维护一个计数器。在实际的 Flink 应用中,有状态的函数可以用于处理窗口操作、聚合操作等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值