java Flink(二)数据流处理demo

上文介绍的是数据批处理,可以简单理解为就是一批固定的数据

数据流处理的意思是,有源源不断的数据,来一个数据进行以此处理。

还是一样的分词处理,这次用流处理方式,直接上代码(文件看上文)

import org.apache.flink.api.java.DataSet;
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.environment.StreamExecutionEnvironment;

public class StreamWordCount {
    public static void main(String[] args) throws Exception{
        //创建流处理环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //设置并行度
        //env.setParallelism(8);
        //从文件中读取数据
        String inputPath = "D:\\idle\\FlinkTest\\src\\main\\resources\\word.txt";
        DataStream<String> inputDataStream = env.readTextFile(inputPath);
        //基于数据流进行转换 new WordCount.MyflatMapper()上文写好的flatMap
        DataStream<Tuple2<String,Integer>> resultStream = inputDataStream.flatMap(new WordCount.MyflatMapper()).keyBy(0)//按照当前key的hashcode进行重分区
                .sum(1);
        resultStream.print();
        //执行任务 启动任务
        env.execute();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个基于 Flink SQL 实现的简单实时处理demo,其中包含了一个 join 操作。 首先,我们需要准备两个数据流,分别是订单数据和用户数据。可以使用 Flink 的 DataStream API 从 Kafka 中读取实时数据,也可以使用模拟数据生成工具来生成测试数据。 ```java // 订单数据流 DataStream<Order> orderStream = env.addSource(new FlinkKafkaConsumer<>("order-topic", new OrderDeserializationSchema(), properties)) .assignTimestampsAndWatermarks(new OrderTimestampExtractor()); // 用户数据流 DataStream<User> userStream = env.addSource(new FlinkKafkaConsumer<>("user-topic", new UserDeserializationSchema(), properties)) .assignTimestampsAndWatermarks(new UserTimestampExtractor()); ``` 接下来,我们使用 Flink SQL 将两个数据流进行 join 操作。需要注意的是,Flink SQL 中的 join 操作需要指定连接条件和窗口类型。 ```java // 注册临时视图 tableEnv.createTemporaryView("orders", orderStream, $("orderId"), $("userId"), $("orderTime").rowtime()); tableEnv.createTemporaryView("users", userStream, $("userId"), $("userName"), $("gender")); // 执行 join 操作 Table resultTable = tableEnv.sqlQuery("SELECT o.orderId, o.orderTime, u.userName FROM orders o " + "JOIN users u ON o.userId = u.userId " + "WHERE o.orderTime BETWEEN u.rowtime - INTERVAL '5' SECOND AND u.rowtime + INTERVAL '5' SECOND"); // 将结果转换为数据流 DataStream<Result> resultStream = tableEnv.toAppendStream(resultTable, Result.class); ``` 最后,我们可以将结果数据流写入到 Kafka 中,或者直接打印出来。 ```java // 将结果写入到 Kafka 中 resultStream.addSink(new FlinkKafkaProducer<>("result-topic", new ResultSerializationSchema(), properties)); // 打印结果 resultStream.print(); ``` 完整的示例代码如下: ```java // 定义订单数据结构 public class Order { public long orderId; public long userId; public Timestamp orderTime; } // 定义用户数据结构 public class User { public long userId; public String userName; public String gender; } // 定义 join 结果数据结构 public class Result { public long orderId; public Timestamp orderTime; public String userName; } // 订单数据流的时间戳提取器 public class OrderTimestampExtractor extends BoundedOutOfOrdernessTimestampExtractor<Order> { public OrderTimestampExtractor() { super(Time.seconds(10)); } @Override public long extractTimestamp(Order element) { return element.orderTime.getTime(); } } // 用户数据流的时间戳提取器 public class UserTimestampExtractor extends BoundedOutOfOrdernessTimestampExtractor<User> { public UserTimestampExtractor() { super(Time.seconds(10)); } @Override public long extractTimestamp(User element) { return System.currentTimeMillis(); } } public class FlinkSQLJoinDemo { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env); Properties properties = new Properties(); properties.setProperty("bootstrap.servers", "localhost:9092"); properties.setProperty("group.id", "test-group"); // 订单数据流 DataStream<Order> orderStream = env.addSource(new FlinkKafkaConsumer<>("order-topic", new OrderDeserializationSchema(), properties)) .assignTimestampsAndWatermarks(new OrderTimestampExtractor()); // 用户数据流 DataStream<User> userStream = env.addSource(new FlinkKafkaConsumer<>("user-topic", new UserDeserializationSchema(), properties)) .assignTimestampsAndWatermarks(new UserTimestampExtractor()); // 注册临时视图 tableEnv.createTemporaryView("orders", orderStream, $("orderId"), $("userId"), $("orderTime").rowtime()); tableEnv.createTemporaryView("users", userStream, $("userId"), $("userName"), $("gender")); // 执行 join 操作 Table resultTable = tableEnv.sqlQuery("SELECT o.orderId, o.orderTime, u.userName FROM orders o " + "JOIN users u ON o.userId = u.userId " + "WHERE o.orderTime BETWEEN u.rowtime - INTERVAL '5' SECOND AND u.rowtime + INTERVAL '5' SECOND"); // 将结果转换为数据流 DataStream<Result> resultStream = tableEnv.toAppendStream(resultTable, Result.class); // 将结果写入到 Kafka 中 resultStream.addSink(new FlinkKafkaProducer<>("result-topic", new ResultSerializationSchema(), properties)); // 打印结果 resultStream.print(); env.execute("Flink SQL Join Demo"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值