Flink-join的三种方式

Join

/**
 *
 * 将两个数据流,进行join
 *
 * 如果让两个流能够join上,必须满足以下两个条件
 * 1.由于数据是分散在多台机器上,必须将join条件相同的数据通过网络传输到同一台机器的同一个分区中(按照条件进行KeyBy)
 * 2.让每个流中的数据都放慢,等等对方(划分相同类型,长度一样的窗口)
 *
 */
public class EventTumblingWindowJoin {

    public static void main(String[] args) throws Exception {

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //1000,o001,c001
        DataStreamSource<String> lines1 = env.socketTextStream("linux01", 7777);
        //1200,c001,图书
        DataStreamSource<String> lines2 = env.socketTextStream("linux01", 8888);

        //按照EventTime进行join,窗口长度为5000秒,使用新的提取EventTime生成WaterMark的API

        //提取两个流的Watermark
        SingleOutputStreamOperator<String> lines1WithWatermark
                = lines1.assignTimestampsAndWatermarks(WatermarkStrategy.<String>forBoundedOutOfOrderness(Duration.ofSeconds(0)).withTimestampAssigner(new SerializableTimestampAssigner<String>() {

            @Override
            public long extractTimestamp(String element, long recordTimestamp) {
                return Long.parseLong(element.split(",")[0]);
            }
        }));

        SingleOutputStreamOperator<String> lines2WithWatermark
                = lines2.assignTimestampsAndWatermarks(WatermarkStrategy.<String>forBoundedOutOfOrderness(Duration.ofSeconds(0)).withTimestampAssigner(new SerializableTimestampAssigner<String>() {

            @Override
            public long extractTimestamp(String element, long recordTimestamp) {
                return Long.parseLong(element.split(",")[0]);
            }
        }));

        //对两个流进行处理

        SingleOutputStreamOperator<Tuple3<Long, String, String>> tpStream1
                = lines1WithWatermark.map(new MapFunction<String, Tuple3<Long, String, String>>() {

            @Override
            public Tuple3<Long, String, String> map(String input) throws Exception {
                String[] fields = input.split(",");
                return Tuple3.of(Long.parseLong(fields[0]), fields[1], fields[2]);
            }
        });

        SingleOutputStreamOperator<Tuple3<Long, String, String>> tpStream2
                = lines2WithWatermark.map(new MapFunction<String, Tuple3<Long, String, String>>() {

            @Override
            public Tuple3<Long, String, String> map(String input) throws Exception {
  
### 使用 Apache Flink 与 JDBC 集成进行数据处理 #### 创建执行环境 为了在 Apache Flink 中使用 JDBC 连接器,首先需要创建一个 Flink 执行环境。这可以通过 `StreamExecutionEnvironment` 来完成,它是所有 Flink 应用程序的基础组件之一。 ```java final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); ``` #### 启用 Blink Planner 对于更复杂的 SQL 处理需求,建议启用 Blink Planner,它可以提供更好的性能和支持更多特性: ```java TableEnvironment tableEnv = TableEnvironment.create( EnvironmentSettings.newInstance() .useBlinkPlanner() // 启用 Blink Planner 支持更多 SQL 特性[^5] .inStreamingMode() .build()); ``` #### 注册输入表和输出表 接下来定义要操作的数据源(即输入表),以及目标存储位置(即输出表)。这里展示的是从 Kafka 获取订单信息作为输入,并将结果保存至 MySQL 数据库的过程。 ```sql CREATE TABLE orders ( order_id BIGINT, product STRING, amount INT ) WITH ( 'connector' = 'kafka', 'topic' = 'orders', 'properties.bootstrap.servers' = 'localhost:9092', 'format' = 'json' ); CREATE TABLE result ( order_id BIGINT, total_amount DOUBLE ) WITH ( 'connector' = 'jdbc', -- 使用 JDBC connector 'url' = 'jdbc:mysql://localhost:3306/mydb', 'table-name' = 'result_table', -- 输出到指定的数据库表格 'username' = 'root', 'password' = 'your_password_here' ); ``` 以上配置说明了如何设置两个表结构及其对应的连接方式;其中一个是基于Kafka的消息队列系统中的主题来获取JSON格式化的消息流,另一个则是通过JDBC协议向MySQL服务器发送查询请求并更新特定的关系型数据库记录。 #### 实现逻辑转换过程 最后一步就是编写实际业务逻辑代码,比如统计每个产品的销售总额并将这些汇总后的数值存入之前提到的结果表里去。 ```sql INSERT INTO result SELECT order_id, SUM(amount * price) AS total_amount FROM orders JOIN products ON orders.product=products.name GROUP BY order_id; ``` 这段SQL语句实现了对来自Kafka的主题中每条记录按照产品名称关联上价格字段之后求得总金额的操作,并最终把计算得到的新纪录插入到了名为`result`的目标表内。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值