Flink02-学习-套接字分词

flatmap()

AMapFunction仅适用于执行一对一转换的情况:对于每个进入的流元素,map()都会发出一个转换后的元素。否则,您需要使用 flatmap()

java 复制代码
DataStream<TaxiRide> rides = env.addSource(new TaxiRideSource(...));

DataStream<EnrichedRide> enrichedNYCRides = rides
    .flatMap(new NYCEnrichment());

enrichedNYCRides.print();

连同FlatMapFunction:

java 复制代码
DataStream<TaxiRide> rides = env.addSource(new TaxiRideSource(...));

DataStream<EnrichedRide> enrichedNYCRides = rides
    .flatMap(new NYCEnrichment());

enrichedNYCRides.print();

通过Collector此接口提供的功能,该flatmap()方法可以发出任意数量的流元素,包括不发出任何元素。

实践

Flink 的 DataStream API 允许你流式传输任何可以序列化的数据。Flink 自己的序列化器用于

基本类型,即 String、Long、Integer、Boolean、Array

复合类型:Tuples、POJO

对于其他类型,Flink 会回退到 Kryo。Flink 也可以使用其他序列化器。

pom内容如上个内容,此处不再赘述 。
定义本机变量

连接的 IP 地址为 0.0.0.0(监听所有网络接口)

java 复制代码
// 本机
 String ip = "0.0.0.0";
 //开启的端口号
 int port = 8886;

获取flink环境

java 复制代码
StreamExecutionEnvironment executionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment();

使用套接字-socket流

java 复制代码
  DataStreamSource<String> stringDataStreamSource = executionEnvironment.socketTextStream(ip, port, "\n");

FlatMap-分词

数据转换 - 分词和计数。

使用 flatMap 操作对每行文本进行分词处理;

将每行文本按空白字符分割成单词数组;

为每个单词生成一个 (单词, 1) 的元组(Tuple2);

结果是一个包含 (单词, 计数) 对的流

java 复制代码
SingleOutputStreamOperator<Tuple2<String, Long>> tuple2SingleOutputStreamOperator = stringDataStreamSource.flatMap(new FlatMapFunction<String, Tuple2<String, Long>>() {

            @Override
            public void flatMap(String s, Collector<Tuple2<String, Long>> collector) throws Exception {
                String[] splits = s.split("\\s");
                for (String word : splits) {
                    collector.collect(Tuple2.of(word, 1L));
                }
            }
        });

分组和窗口计算

keyBy: 按照元组的第一个字段(单词)进行分组;

window: 定义滑动窗口:窗口大小:5秒,滑动间隔:1秒;

sum(1): 对每个窗口内相同单词的计数(元组的第二个字段)求和;

java 复制代码
SingleOutputStreamOperator<Tuple2<String, Long>> word = tuple2SingleOutputStreamOperator
                .keyBy(new KeySelector<Tuple2<String, Long>, Object>() {
                    @Override
                    public Object getKey(Tuple2<String, Long> stringLongTuple2) throws Exception {
                        return stringLongTuple2.f0;
                    }
                })
                .window(SlidingProcessingTimeWindows.of(Time.seconds(5), Time.seconds(1)))
                .sum(1);

完整代码

java 复制代码
package org.example.snow.demo2;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple2;
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.windowing.assigners.SlidingProcessingTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;

public class startDemo {
    public static void main(String[] args) throws Exception {
        String ip = "0.0.0.0";
        int port = 8886;
        StreamExecutionEnvironment executionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment();
        // 使用socket流创建一个从 socket 读取文本的数据流,以换行符 \n 作为分隔符
        DataStreamSource<String> stringDataStreamSource = executionEnvironment.socketTextStream(ip, port, "\n");
        SingleOutputStreamOperator<Tuple2<String, Long>> tuple2SingleOutputStreamOperator = stringDataStreamSource.flatMap(new FlatMapFunction<String, Tuple2<String, Long>>() {

            @Override
            public void flatMap(String s, Collector<Tuple2<String, Long>> collector) throws Exception {
                String[] splits = s.split("\\s");
                for (String word : splits) {
                    collector.collect(Tuple2.of(word, 1L));
                }
            }
        });
        SingleOutputStreamOperator<Tuple2<String, Long>> word = tuple2SingleOutputStreamOperator
                .keyBy(new KeySelector<Tuple2<String, Long>, Object>() {
                    @Override
                    public Object getKey(Tuple2<String, Long> stringLongTuple2) throws Exception {
                        return stringLongTuple2.f0;
                    }
                })
                .window(SlidingProcessingTimeWindows.of(Time.seconds(5), Time.seconds(1)))
                .sum(1);
        word.print();
        executionEnvironment.execute("stream!");
    }
}

启动服务

java 复制代码
nc -lk 8886

运行效果

相关推荐
David猪大卫2 小时前
【C++修炼】STL容器—模板进阶:非类型模板参数、模板特化、模板分离编译
c语言·开发语言·c++·经验分享·笔记·学习·面试
牛战士coding2 小时前
Java 对象写入 Redis 后类型变了?Jackson 多态序列化问题复盘
java·开发语言·redis
幼儿园蛋小黄2 小时前
嵌入式学习总结:从 I2C 到 SPI 的驱动开发实战
驱动开发·学习
Chasing__Dreams2 小时前
python杂识--24--Nuitak打包exe
开发语言·python
老当益壮梁奶奶2 小时前
驱动学习(二):从零开始:驱动工程搭建与字符设备驱动框架详解(基于IMX6ULL)
c语言·arm开发·驱动开发·嵌入式硬件·学习
yuniko-n2 小时前
【JUC】读写锁
java·开发语言
niucloud-admin2 小时前
NIUCLOUD LITE AI开发文档--基础开发规范
开发语言·php
叶子野格2 小时前
《FPGA基本知识累积:看开发指南要懂的术语》
学习·fpga开发
qq_284274052 小时前
液压泵工作原理与性能参数笔记:能量转换与吸压油三必要条件、压力分级、排量流量与三种效率特性曲线、径向轴向柱塞泵变量原理及配流配油盘(含考点)
笔记·学习·自动化·制造
小羊没烦恼!2 小时前
T-SQL查询高级—SQL Server索引中的碎片和填充因子
开发语言·前端·javascript·数据库·后端·python·web安全