https://ci.apache.org/projects/flink/flink-docs-release-1.3/api/scala/index.html#org.apache.flink.api.scala.DataSet
本文介绍 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、
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文件。