flink的DataSet算子讲解

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

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一样)由于数据集可以包含大量的数据,所以使用方便的
方法将数据集的元素作为列表来获取,这种方法应该谨慎使用。

4、combineGroup:在分组数据集上应用GroupCombineFunction。

GroupCombineFunction类似于GroupReduceFunction,但不执行完整的数据交换。

相反,GroupCombineFunction调用一次合并方法,将一组结果组合起来。该操作符

适合于将值组合为中间格式,然后再进行适当的groupReduce,将数据拖跨节点以进

一步减少。通过实现RichGroupReduce函数,还可以为GroupReduce操作符提供一个

组合器。RichGroupReduce函数的组合方法要求输入和输出类型相同。另一方面,

GroupCombineFunction可以有任意的输出类型。

5、count:(和spark用法一样)获取数据集的计数(元素数量)的方便方法。

6、cross:通过形成这个数据集和其他数据集的笛卡尔积,创建一个新的数据集。

        默认的交叉结果是一个数据集,其值为两个元组。如果需要对结果进行更多的控制,则可以使用自

定义交叉函数。这可以作为一个lambda或一个自定义的交叉函数。

例如:

val left: DataSet[(String, Int, Int)] = ...
val right: DataSet[(Int, String, Int)] = ...
val product = left.cross(right) { (l, r) => (l._2, r._3) }
}

    6.1、crossWithHuge:特殊的交叉操作,明确地告诉系统,左侧被认为比笛卡尔积的右

            边小很多

    

     6.2、crossWithTiny:特殊的交叉操作,明确地告诉系统右侧被认为比笛卡尔积 的左边小很多。

            7、distinct:使用字段位置键返回一组不同的元组数据集。(取出数据键相同的数据键)

                如果输入是复合类型(Tuple或Pojo类型),那么在所有字段上都执行不同的操作,每个字段必须是一个键类型。

                字段位置键指定了元组的字段,如果两个元组是不同的,就会做出决定。

               注意:只能为Tuple数据集指定字段位置键

        

        8、filter:(过滤)创建只包含满足给定筛选谓词的元素的新数据集。

        9、first:创建包含该数据集的前n个元素的新数据集。

        10、flatMap:通过将给定的函数应用到每个元素并使结果趋于平滑,创建一个新的数据集。

        11、fullOuterJoin:特殊的fullOuterJoin操作,明确告诉系统使用什么连接策略。如果将null作为连接策略给出,那么优化器将选择策略。

        12、getExecutionEnvironment:返回与当前数据集相关联的执行环境。

        13、getParallelism:返回该操作的并行性。

        14、getType:返回该数据集的元素的类型信息。

        15、groupBy:创建一个GroupedDataSet,它提供对元素组的操作。元素根据给定的字段分组。这将不会创建一个新的数据集,它只会附加字段名,在执行分组操作时将用于分组。

        16、iterate:使用给定的步骤函数执行批量迭代创建一个新的数据集。在执行最后时,迭代终止。

例如:

    val input: DataSet[(String, Int)] = ...
    val iterated = input.iterate(5) { previous =>
    val next = previous.map { x => (x._1, x._2 + 1) }
      next
    }
这个示例将简单地增加元组的第二个字段5。

    17、iterateDelta:使用给定的步骤函数执行delta(或工作集)迭代创建一个新的数据集。

在开始时,这个数据集是解决方案集,而工作集是工作集。迭代步骤函数得到当前的解决

方案集和工作集,并且必须输出解决方案集的delta和下一个迭代的工作集。

注意:增量迭代的语法很可能很快就会改变。

    18、iterateWithTermination:使用给定的步骤函数执行批量迭代创建一个新的数据集。

步骤函数返回的第一个数据集是下一个迭代的输入,第二个数据集是终止标准。当终止标

准数据集不包含任何元素,或者在达到最后迭代时,迭代终止。

例如:
    
val input: DataSet[(String, Int)] = ...
val iterated = input.iterateWithTermination(5) { previous =>
  val next = previous.map { x => (x._1, x._2 + 1) }
  val term = next.filter { _._2 <  3 }
  (next, term)
}
这个示例只会增加元组的第二个字段,直到它们不再小于3。

        19、join:特殊连接操作,明确告知系统使用什么连接策略。如果将null作为连接策略给出,那么优化器将选择策略。

            19.1 joinWithHuge、

                joinWithTiny、

                    leftOuterJoin、

                    (自个看算子名称,CSDN的富文本编辑太差劲了)

            

        20、map:(和spark的用法一样)通过将给定的函数应用于该数据集的每个元素,创建一个新的数据集。


        21、mapPartition:通过将给定的函数应用于数据集的每个并行分区,创建一个新的数据集。
此函数用于不能转换单个元素且不需要元素分组的操作。为了转换单个元素,最好使用map和flatMap。


        22、max:获取数据集中最大值

        23、maxBy:选择具有最大值的元素。最大值是根据字典顺序的指定字段计算的。

                例1:给定一个带有元素的数据集[0,1],[1,0],结果将是:          

            maxBy(0)[1, 0]
            maxBy(1)[0, 1]
        例2:给定一个包含元素的数据集[0,0],[0,1],结果将是:
        maxBy(0, 1)[0, 1]
    如果在指定的字段中存在具有最大值的多个值,则在内部选择一个随机的值,这个操作将作为一个reduce函数实现。

  24、min:获取数据集最小值

  26、minBy:选择具有最小值的元素。最小值是通过字典顺序的指定字段来计算的。

    例1:给定一个带有元素的数据集[0,1],[1,0],结果将是:  

        minBy(0)[0, 1]
        minBy(1)[1, 0]
    例2:给定一个包含元素的数据集[0,0],[0,1],结果将是:    
        minBy(0, 1)[0, 0]
如果在指定字段中有多个具有最小值的值,则会选择一个随机值。在内部,这个操作被实现为一个还原函数。

27、minResources:返回该操作的最小资源。

28、name:设置数据集的名称。这将出现在执行图的日志和图形表示中。

29、output:使用一个自定义org.apache.flink.api.common.io.OutputFormat发出

这个数据集。

30、partitionByHash:使用指定的键选择器函数对数据集进行分区。重要:该操作将整个数据集在网络上进行了洗牌,并且可以花费大量的时间。

31、partitionByRange:使用指定的键选择器函数来划分数据集。重要的:这个操作需要一个额外的通过数据集来计算范围边界,并在整个网络上打乱整

个数据集。这需要大量的时间。

32、partitionCustom:在选择器返回的键上分区一个数据集、POJO数据集、元组数据集,

使用自定义的分区器。该方法使用密钥选择器来获取关键的分区,以及接受密钥类型的分区。注意:此方法只对单个字段键有效,即选择器不能返回字段的元组。

33、preferredResources:返回该操作的首选资源。

34、print:将数据集中的元素打印到标准输出流系统。在调用print()方法的JVM中。

对于在集群中执行的程序,此方法需要将数据集的内容收集回客户机,以便在那里打印。为每个元素编写的字符串由AnyRef定义。toString方法。该方法会立即触发程序执行,类似于collect()和count()方法。

    35、printOnTaskManager:将数据集写入执行该程序的任务管理器的标准输出流

(或更具体地说,数据接收器操作符)。在典型的集群设置中,数据将出现在taskmanager的.out文件中。要将数据打印到控制台或客户机进程的stdout流,请使用print()方法。对于数据集的每个元素,将写入AnyRef.toString()的结果。前缀在输出的每行前面加上前缀的字符串。这有助于识别来自不同打印接收器的输出。返回写数据集的DataSink操作符。

    36、printToErr:把错误信息打印出来(表示没用过)

    37、rebalance:强制重新平衡数据集,即,数据集均匀分布于以下任务的所有并行实例中。

这可以帮助在严重数据倾斜和计算密集型操作的情况下提高性能。

    重要:该操作将整个数据集在网络上进行了洗牌,并且可以花费大量的时间。

    38、reduce:通过使用关联reduce函数合并该数据集的元素来创建一个新的数据集。

    39、reduceGroup:通过将此数据集中的所有元素传递给组reduce函数,创建一个新的

数据集。该函数可以使用收集器输出零个或多个元素。所释放的值的连接将形成结果数据集。

    40、registerAggregator:寄存器的org.apache.flink.api.common.aggregators.Aggregator

迭代。聚合器可以用于在迭代过程中维护简单的统计信息,比如处理的元素数量。聚合器计算全局聚合:

在每个迭代步骤之后,全局聚合的值生成一个集合,表示跨所有并行实例的统计数据。

可以在下一次迭代中访问聚合器的值。聚合器可以访问内部函数通过

org.apache.flink.api.common.functions.AbstractRichFunction

# getIterationRuntimeContext。

    

    41、setParallelism:设置此操作的并行性。这个一定大于1。

    42、sortPartition:在按指定的顺序对提取的键上的数据集的分区进行局部排序。

通过从KeySelector返回一个tuple,数据集可以通过多个值进行排序。注意,没有附加的排序键可以附加到KeySelector排序键。要使用KeySelector对

多个值进行分区,KeySelector必须返回由值组成的tuple。

    43、sum:求和

    44、union:创建包含来自该数据集和其他数据集的元素的新数据集。

    45、withBroadcastSet:将特定的数据集添加到该操作符的广播集合中。该操作符

的所有并行实例都可以使用广播数据集。广播数据集以一个特定的名字注册,并且

可以在这个名字从运营商运行时上下文检索通过org.apache.flink.api.common.functions.

RuntimeContext.getBroadCastVariable(字符串)中可用的运行时上下文本身是所有通过

org.apache.flink.api.common.functions.AbstractRichFunction#

getRuntimeContext udf()

   

                46、withForwardedFields、withForwardedFieldsFirst、

                    withForwardedFieldsSecond 、withParameters

                        以上四个不知道是啥,貌似是转发,找不到相应的解释文档               

                47、write:写这个数据集使用自定义org.apache.flink.api.common.io.FileOutputFormat到指定位置。

                   

            48、writeAsCsv:将此数据集写到指定位置为CSV文件。

                    这只适用于元组数据集。对于单个tuple字段AnyRef。使用toString。

            

              49、writeAsText:将此数据集写入指定位置为text文件。


G
M
T
Detect languageAfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu
AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu
Text-to-speech function is limited to 200 characters
展开阅读全文

没有更多推荐了,返回首页