Flink Java Table API & SQL 之实时订单统计

Order 实体类

package com.daidai.source.mocksource.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {
    private String id;
    private Integer userId;
    private Integer money;
    private Long createTime;
}

需求


就是每隔5秒统计最近5秒的每个用户的订单总数、订单的最大金额、订单的最小金额

主程序

package com.daidai.table;

import com.daidai.source.mocksource.domain.Order;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.types.Row;

import java.time.Duration;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

import static org.apache.flink.table.api.Expressions.$;

public class RealtimeOrderStatistics {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

        DataStreamSource<Order> source = env.addSource(new SourceFunction<Order>() {
            private Boolean isRunning = true;

            @Override
            public void run(SourceContext<Order> ctx) throws Exception {
                while (isRunning) {
                    Random random = new Random();
                    Order order = new Order(
                            UUID.randomUUID().toString(),
                            random.nextInt(3),
                            random.nextInt(100),
                            System.currentTimeMillis()
                    );
                    TimeUnit.SECONDS.sleep(1);
                    ctx.collect(order);
                }
            }

            @Override
            public void cancel() {
                isRunning = false;
            }
        });

        SingleOutputStreamOperator<Order> watermarks = source
                .assignTimestampsAndWatermarks(WatermarkStrategy.<Order>forBoundedOutOfOrderness(Duration.ofSeconds(2))
                        .withTimestampAssigner((event, timestamp) -> event.getCreateTime()));

        tableEnv.createTemporaryView("t_order", watermarks, $("id"), $("userId"), $("money"), $("createTime").rowtime());

        String sql = "select " +
                "userId," +
                "count(money) as totalCount," +
                "max(money) as maxMoney," +
                "min(money) as minMoney " +
                "from t_order " +
                "group by userId," +
                "tumble(createTime, interval '5' second)";

        Table result = tableEnv.sqlQuery(sql);

        DataStream<Tuple2<Boolean, Row>> orderResult = tableEnv.toRetractStream(result, Row.class);

        orderResult.print();

        env.execute();
    }
}

注意事项

这种空格得千万注意,不然就得和我一样找大半天错误 ,如果你是用 Table 风格的话,应该不会有这种担忧。
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个基于Flink1.14.3 Table SQL API的MySQL列加工数据处理JAVA代码的示例: ```java import org.apache.flink.api.common.typeinfo.TypeInformation; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.typeutils.RowTypeInfo; import org.apache.flink.connector.jdbc.JdbcInputFormat; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.EnvironmentSettings; import org.apache.flink.table.api.Table; import org.apache.flink.table.api.TableEnvironment; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; import org.apache.flink.types.Row; public class MySQLColumnProcessing { public static void main(String[] args) throws Exception { // 创建执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build()); // 定义MySQL连接信息 String url = &quot;jdbc:mysql://localhost:3306/test&quot;; String username = &quot;root&quot;; String password = &quot;root&quot;; String driverName = &quot;com.mysql.jdbc.Driver&quot;; // 定义MySQL输入格式 JdbcInputFormat jdbcInputFormat = JdbcInputFormat.buildJdbcInputFormat() .setDrivername(driverName) .setDBUrl(url) .setUsername(username) .setPassword(password) .setQuery(&quot;SELECT * FROM user&quot;) .setRowTypeInfo(new RowTypeInfo(TypeInformation.of(Integer.class), TypeInformation.of(String.class), TypeInformation.of(Integer.class))) .finish(); // 创建一个表,并将MySQL数据源注册为表 Table table = tEnv.fromDataStream(env.createInput(jdbcInputFormat), &quot;id, name, age&quot;); tEnv.registerTable(&quot;user&quot;, table); // 使用SQL API进行列加工处理 Table result = tEnv.sqlQuery(&quot;SELECT id, CONCAT(&#39;My name is &#39;, name) as name, age+1 as age FROM user&quot;); // 打印结果 tEnv.toRetractStream(result, Row.class).print(); // 执行任务 env.execute(&quot;MySQL Column Processing&quot;); } } ``` 这个示例代码读取MySQL数据库中的`user`表数据,对`name`列进行字符串拼接,并对`age`列进行加1操作,最后将结果打印出来。您需要将MySQL连接信息替换为自己的连接信息,并根据具体的业务需求修改SQL查询语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值