专栏首页kk大数据Flink 16种数据转换操作,满足所有数据处理场景

Flink 16种数据转换操作,满足所有数据处理场景

数据转换(Transformation),即通过从一个或多个 DataStream 生成新的DataStream 的过程,是主要的数据处理的手段。Flink 提供了多种数据转换操作,基本可以满足所有的日常使用场景。

所有的转换操作可分为:

单 Single-DataStream

多 Multi-DataStream

物理分区

三种类型

今天我们讨论 单 DataStream 转换 的场景

01

Map

Map 操作对 DataStream[ T ] 数据进行处理,常用作对数据集的清洗和转换。

如下代码展示了,把 每个tuple 的第二个元素加1的过程

val env = StreamExecutionEnvironment.getExecutionEnvironment
env.fromElements(("1",5),("2",6),("3",9))
  .map(m => (m._1,m._2 + 1))

除了可以直接在 map 方法中直接传入计算表达式,还可以使用 MapFunction 接口定义 map 函数逻辑,如下代码:

env.fromElements(("1",5),("2",6),("3",9))
  .map(
    new MapFunction[(String,Int),(String,Int)] {
    override def map(value: (String, Int)): (String, Int) = {
      (value._1,value._2 + 2)
    }
  })

02

FlatMap

FlatMap 算子主要应用处理输入一个元素,产生一个或者多个元素的计算场景,常见的例子就是 WordCount 中,将每一行的文本数据切割,生成单词序列。

env.fromElements("123 sffs ffe")
  .flatMap(str => str.split(" "))

输入结果集是一个字符串:123 sffs ffe

输出结果集是三个字符串:123 和 sffs 和 ffe

03

Filter

该算子是按照条件对结果集进行筛选操作,将符合条件的数据集输出,将不符合条件的结果过滤掉。

如下代码筛选出所有偶数

env.fromCollection(List(1,2,3,4))
  .filter(_ % 2 == 0)

可以用在日志过滤,数据清洗等场景

04

KeyBy

根据指定的 key 将输入的 DataStream[ T ] 数据格式转换为 KeyedStream[ T ] ,相当于在数据集中执行 partition 操作,将相同的 key 值的数据放到相同的分区中,如下代码所示:

env.fromElements((1,5),(2,3),(4,5),(4,6))
  .keyBy(0)
  .print()

根据第一个值来分区,结果是:

1> (4,5)

4> (2,3)

1> (4,6)

3> (1,5)

可以用在 对数据分组统计的场景

05

Reduce

该算子和 MapReduce 中的 reduce 的意思是一样的,主要是将 KeyedStream 的数据通过用户自定义的 ReduceFunction 滚动地进行数据聚合处理。

env.fromElements((1,5),(2,3),(4,5),(4,6))
  .keyBy(0)
  .reduce((t1,t2) => (t1._1,t1._2 + t2._2))
  .print()

对第二个元素进行累加,结果如下:

3> (1,5)

4> (2,3)

1> (4,5)

1> (4,11)

06

Aggregations

这是一系列算子的统称,其实就是将 Reduce 中的算子进行了封装,封装的聚合操作有 sum,min,max,maxBy 等,这样用户就不同自己定义函数了

val env = StreamExecutionEnvironment.getExecutionEnvironment
env.fromElements((1,5),(2,3),(4,5),(4,6))
  .keyBy(0)
  .sum(1)
  .print()
env.fromElements((1,5),(2,3),(4,5),(4,6))
  .keyBy(0)
  .min(1)
  .print()

本文分享自微信公众号 - kk大数据(kkbigdata),作者:wangkai

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Flink DataStream 内置数据源和外部数据源

    在 StreamExecutionEnvironment 中,可以使用 readTextFile 方法直接读取文本文件,也可以使用 readFile 方法通过指...

    kk大数据
  • Hive 系列 之 基础知识和操作合集

    今天,朋友圈和公众号被鸿蒙刷屏,作为开发者,由衷感叹人类科技已经发展得这么先进了,基于微内核的全场景分布式OS,虽然不太懂是什么意思,但仍然觉得高大上。

    kk大数据
  • Java虚拟机:我们写的java代码究竟是如何运行起来的

    首先假设咱们写好了一份Java代码,那这份Java代码中,是不是会包含很多的“.java”为后缀的代码文件?

    kk大数据
  • matlab强化学习Q-Learning与Sarsa对比

    观察下一步选取哪一个动作会带来最大的奖励, 但是在真正要做决定时, 却不一定会选取到那个带来最大奖励的动作, Q-learning 只是估计了一下接下来的动作值

    万木逢春
  • jni小细节操作

    曾大稳
  • Serverless 多环境配置方案探索

    相信读完前面几篇有关 Serverless Component 文章的小伙伴已经体验到,它给我们开发带来的便利。但是实际我们的日常开发项目中,并不仅仅只是单纯...

    腾讯云serverless团队
  • Serverless Component

    相信读完前面几篇有关 Serverless Component 文章的小伙伴已经体验到,它给我们开发带来的遍历。但是实际我们的日常开发项目中,并不仅仅只是单纯地...

    不会飞的小鸟
  • Vue(CLI3.0)多环境配置问题2020

    程序员不务正业
  • IOS开发必须知道的3DLabel实现过程

    最近写了很多关于SceneKit 的入门教程文章,初衷就是想给应用增加一点色彩,今天就教大家实现一个简单的3DLabel 的小框架.如果你的应用中需要实现3D字...

    酷走天涯
  • IDEA 非常重要的一些设置项 → 一连串的问题差点让我重新用回 Eclipse !

      上联:一天晚上两个甲方三更半夜四处催图只好周五加班到周六早上七点画好八点传完九点上床睡觉十分痛苦

扫码关注云+社区

领取腾讯云代金券