Flink SQLJoin案例

package com.cnic.app;

import com.cnic.bean.Bean1;
import com.cnic.bean.Bean2;
import com.cnic.utils.MyKafkaUtil;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
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;

public class FlinkSQLJoinTest {

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

        //获取执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

        System.out.println(tableEnv.getConfig().getIdleStateRetention());
        tableEnv.getConfig().setIdleStateRetention(Duration.ofSeconds(10));

        FlinkKafkaConsumer<String> kafkaConsumer = MyKafkaUtil.getKafkaConsumer("", "");

        //-host hadoop102 -port 8888
        ParameterTool parameterTool = ParameterTool.fromArgs(args);
        String host = parameterTool.get("host");
        int port = parameterTool.getInt("port");

        ParameterTool propertiesFile = ParameterTool.fromPropertiesFile("./");
        String s = propertiesFile.get("");

        //读取数据创建流
        SingleOutputStreamOperator<Bean1> bean1DS = env.socketTextStream(host, port)
                .map(line -> {
                    String[] split = line.split(",");
                    return new Bean1(split[0],
                            split[1],
                            Long.parseLong(split[2]));
                });

        SingleOutputStreamOperator<Bean2> bean2DS = env.socketTextStream("hadoop102", 9999)
                .map(line -> {
                    String[] split = line.split(",");
                    return new Bean2(split[0],
                            split[1],
                            Long.parseLong(split[2]));
                });

        //将流转换为动态表
        tableEnv.createTemporaryView("t1", bean1DS);
        tableEnv.createTemporaryView("t2", bean2DS);

        //内连接       左表:OnCreateAndWrite   右表:OnCreateAndWrite
//        tableEnv.sqlQuery("select t1.id,t1.name,t2.sex from t1 join t2 on t1.id = t2.id")
//                .execute()
//                .print();

        //左外连接     左表:OnReadAndWrite     右表:OnCreateAndWrite
//        tableEnv.sqlQuery("select t1.id,t1.name,t2.sex from t1 left join t2 on t1.id = t2.id")
//                .execute()
//                .print();

        //右外连接     左表:OnCreateAndWrite   右表:OnReadAndWrite
//        tableEnv.sqlQuery("select t2.id,t1.name,t2.sex from t1 right join t2 on t1.id = t2.id")
//                .execute()
//                .print();

        //全外连接     左表:OnReadAndWrite     右表:OnReadAndWrite
//        tableEnv.sqlQuery("select t1.id,t2.id,t1.name,t2.sex from t1 full join t2 on t1.id = t2.id")
//                .execute()
//                .print();

        Table table = tableEnv.sqlQuery("select t1.id,t1.name,t2.sex from t1 left join t2 on t1.id = t2.id");
//        DataStream<Tuple2<Boolean, Row>> retractStream = tableEnv.toRetractStream(table, Row.class);
//        retractStream.print(">>>>>>>>>");
        tableEnv.createTemporaryView("t", table);

        //创建Kafka表
        tableEnv.executeSql("" +
                "create table result_table(" +
                "    id string," +
                "    name string," +
                "    sex string," +
                "    PRIMARY KEY (id) NOT ENFORCED " +
                ") " + MyKafkaUtil.getUpsertKafkaDDL("test"));

        //将数据写入Kafka
        tableEnv.executeSql("insert into result_table select * from t")
                .print();

        env.execute();

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Flink SQL中的JOIN操作可以用于实时流处理,实时处理时需要使用Flink的DataStream API将数据流转换为Flink SQL中的Table,并且需要使用Flink的Table API或SQL API执行JOIN操作。 具体的实时JOIN操作步骤如下: 1. 将数据流转换为Table:使用Flink的DataStream API将实时数据流转换为Flink SQL中的Table,可以使用Flink的Table API或SQL API进行操作。例如,可以使用Table API的`fromDataStream`方法将DataStream转换为Table: ``` DataStream<Order> orderStream = ...; Table orderTable = tableEnv.fromDataStream(orderStream); ``` 2. 定义Table Schema:定义Table的结构,包括字段名和数据类型等。这可以通过Table API或SQL API进行定义,例如: ``` Table orderTable = tableEnv.fromDataStream(orderStream, "order_id, user_id, order_total"); ``` 3. 执行JOIN操作:使用Flink SQL中的JOIN操作对Table进行JOIN操作,可以使用Table API或SQL API进行操作。例如,可以使用SQL API的`SELECT`语句进行JOIN操作: ``` String joinSql = "SELECT o.order_id, o.order_total, u.user_name " + "FROM Orders o " + "LEFT JOIN Users u ON o.user_id = u.user_id"; Table joinResult = tableEnv.sqlQuery(joinSql); ``` 4. 输出结果:将JOIN操作后的结果输出到指定的目标位置,可以使用Flink的DataStream API将Table转换为DataStream,并输出到Kafka、MySQL等数据源。 ``` DataStream<Row> joinStream = tableEnv.toAppendStream(joinResult, Row.class); joinStream.addSink(...); ``` 总的来说,Flink SQL中的JOIN操作可以用于实时流处理,可以快速地将多个数据流进行JOIN操作,并输出到指定的目标位置。使用Flink SQL进行实时JOIN操作,可以大大简化代码编写和维护的工作,提高数据处理的效率和准确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cts618

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值