|NO.Z.00026|——————————|BigDataEnd|——|Hadoop&Flink.V10|——|Flink.v10|API详解Flink DataSet|DataSource|Transformation|Sink|
一、Flink DataSet常用API
### --- Flink DataSet常用API
~~~ DataSet API同DataStream API一样有三个组成部分,各部分作用对应一致,此处不再赘述
二、DataSource
### --- DataSource
~~~ 对DataSet批处理而言,较为频繁的操作是读取HDFS中的文件数据,
~~~ 因为这里主要介绍两个DataSource组件
### --- 基于集合
~~~ fromCollection(Collection),主要是为了方便测试使用
### --- 基于文件
~~~ readTextFile(path),基于HDFS中的数据进行计算分析
三、Transformation:Transformation实现方法
| TransFormation | Description |
| Map | 在算子中得到一个元素并生成一个新元素data.map { x => x.toInt } |
| FlatMap | 在算子中获取一个元素, 并生成任意个数的元素data.flatMap { str =>str.split(" ") } |
| MapPartition | 类似Map, 但是一次Map一整个并行分区data.mapPartition { in => in map { (_, 1) } } |
| Filter | 如果算子返回true则包含进数据集, 如果不是则被过滤掉data.filter { _ > 100 } |
| Reduce | 通过将两个元素合并为一个元素, 从而将一组元素合并为一个元素 data.reduce { _ + _ } |
| ReduceGroup | 将一组元素合并为一个或者多个元素 data.reduceGroup { elements => elements.sum } |
| Aggregate | 讲一组值聚合为一个值, 聚合函数可以看作是内置的Reduce函数 data.aggregate(SUM, 0).aggregate(MIN, 2)data.sum(0).min(2) |
| Distinct | 去重 |
| Join | 按照相同的Key合并两个数据集 input1.join(input2).where(0).equalTo(1)同时也可以选择进行合并的时候的策略, 是分区还是广播, 是基于排序的算法还是基于哈希的算法 input1.join(input2, JoinHint.BROADCAST_HASH_FIRST).where(0).equalTo(1) |
| OuterJoin | 外连接, 包括左外, 右外, 完全外连接等 left.leftOuterJoin(right).where(0).equalTo(1) { (left, right) => ... } |
| CoGroup | 二维变量的Reduce运算, 对每个输入数据集中的字段进行分组, 然后join 这些组input1.coGroup(input2).where(0).equalTo(1) |
| Cross | 笛卡尔积input1.cross(input2) |
| Union | 并集input1.union(input2) |
| Rebalance | 分区重新平衡, 以消除数据倾斜input.rebalance() |
| Hash-Partition | 按照Hash分区input.partitionByHash(0) |
| Range-Partition | 按照Range分区input.partitionByRange(0) |
| CustomParititioning | 自定义分区input.partitionCustom(partitioner: Partitioner[K], key) |
| First-n | 返回数据集中的前n个元素input.first(3) |
| partitionByHash | 按照指定的key进行hash分区 |
| sortPartition | 指定字段对分区中的数据进行排序 |
### --- Flink针对DataSet也提供了大量的已经实现的算子,和DataStream计算很类似
~~~ Map:输入一个元素,然后返回一个元素,中间可以进行清洗转换等操作
~~~ FlatMap:输入一个元素,可以返回0个、1个或者多个元素
~~~ Filter:过滤函数,对传入的数据进行判断,符合条件的数据会被留下
~~~ Reduce:对数据进行聚合操作结合当前元素和上一次Reduce返回的值进行聚合操作然后返回一个新值
~~~ Aggregations:sum()、min()、max()等
四、Sink
### --- Flink针对DataStream提供了大量的已经实现的数据目的地(Sink),具体如下所示
~~~ # writeAsText():
~~~ 将元素以字符串形式逐行写入,这些字符串通过调用每个元素的toString()方法来获取
~~~ # writeAsCsv():
~~~ 将元组以逗号分隔写入文件中,行及字段之间的分隔是可配置的,
~~~ 每个字段的值来自对象的toString()方法
~~~ # print()/pringToErr():
~~~ 打印每个元素的toString()方法的值到标准输出或者标准错误输出流中
~~~ Flink提供了一批内置的Connector,其中有的Connector会提供对应的Sink支持,如1.1节中表所示
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
浙公网安备 33010602011771号