flink的DataSet算子讲解

本文详细介绍了Apache Flink的DataSet API,包括aggregate、coGroup、map、reduce等算子的使用方法,以及数据集的读写、并行性设置等操作。这些API用于批处理数据,提供对数据的操作和转换,帮助实现数据处理任务。
摘要由CSDN通过智能技术生成

本文是已官方文档 为基础进行个人解释,有错误地方还望多多包涵:

https://ci.apache.org/projects/flink/flink-docs-release-1.3/api/scala/index.html#org.apache.flink.api.scala.DataSet

首先启动flink集群模式,再启动./start-scala-shell.sh remote master 8082

启动后,flink会提示你:使用预绑定执行环境来实现批处理或流媒体程序。即:

    第一种:

     Batch - Use the 'benv' variable(批量使用“benv”变量)

             val dataSet = benv.readTextFile("/path/to/data")

             dataSet.writeAsText("/path/to/output")

             benv.execute("My batch program")

             HINT: You can use print() on a DataSet to print the contents to the shell.(提示:您可以在数据集上使用print()来   将内容打印到shell中。)

第二种:

    Streaming - Use the 'senv' variable (流式-使用“senv”变量)

      val dataStream = senv.fromElements(1, 2, 3, 4)
     dataStream.countWindowAll(2).sum(0).print()

     senv.execute("My streaming program")

         HINT: You can only print a DataStream to the shell in local mode.(提示:您只能在本地模式下打印一个DataStream到shell。)

本文介绍 org.apache.flink.api.scala.DataSet 下的数据集,Flink的基本抽象。这表示一个特定类型的元素集合。这个类中的操作可以用来创建新的数据集和合并两个数据集。ExecutionEnvironment的方法可以用来从外部源创建数据集,比如HDFS中的文件。可以使用write方法将元素写入存储。。

    DataSet所有操作都接受lambda函数或特定于操作的函数对象来指定操作。例如,使用lambda:

        

val input: DataSet[String] = senv.fromElements("I Love You,I Love Chain")
val mapped = input flatMap { _.split(" ") }
或者使用MapFunction:

val mapped = input flatMap { new FlatMapFunction[String, String] {
  def flatMap(in: String, out: Collector[String]): Unit = {
    in.split(" ") foreach { out.collect(_) }
  }
}
    当需要更多的控制时,可以使用一个丰富的函数,例如访问RuntimeContext。flatMap的富函数是RichFlatMapFunction,所有其他函数的命名都类似。所有的功能都可以在包org.apache.flink.api.common.functions。

    元素的分区取决于ExecutionEnvironment的并行性或一个特定的数据集。


  算子介绍: 

              1、aggregate:使用给定的聚合函数聚合指定的字段,创建一个新的数据集。因为这不是一个键控数据集,所以聚合将在所有元素集合上执行。这只对CaseClass数据集起作用。

                   

               2、coGroup:对于这个数据集和其他数据集的每个键,创建一个包含两个数据集的元素列表的元组。要指定连接键,必须使用where和isEqualTo方法。
                例如:

        val left: DataSet[(String, Int, Int)] = ...
        val right: DataSet[(Int, String, Int)] = ...
        val coGrouped = left.coGroup(right).where(0).isEqualTo(1)

        如果需要对结果进行更多的控制,则可以使用自定义的coGroup函数。
        这可以作为一个lambda或一个自定义的CoGroupFunction
       
         例如:
        
        val left: DataSet[(String, Int, Int)] = ...
        val right: DataSet[(Int, String, Int)] = ...
        val coGrouped = left.coGroup(right).where(0).isEqualTo(1) { (l, r) =>
          // l和r是Iterator迭代器。
          (l.min, r.max)
        }
        coGroup函数与一个收集器可用于实现一个过滤器直接coGroup或输出多个值。这种类型的coGroup函数
不返回一个值,而不是使用收集器排放值
        例如:
        
        val left: DataSet[(String, Int, Int)] = ...
        val right: DataSet[(Int, String, Int)] = ...
        val coGrouped = left.coGroup(right).where(0).isEqualTo(1) {            
            // l和r是Iterator迭代器。          
 
    (l, r, out: Collector[(String, Int)]) =>
      out.collect((l.min, r.max))
     out.collect(l.max, r.min))
     }

3、collect:(和spark的collect一样)由于数据集可以包含大量的数据,所以使用方便的
方法将数据集的元素作为列表来获取,这种方法应该谨慎使用。
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值