大数据之(Transformation)1.前言
Flink应用程序结构就是如上图所示:
1、Source:数据源,Flink在流处理和批处理上的source大概有4类:基于本地集合的source、基于文件的source、基于网络套接字的source、自定义的source。自定义的source常见的有Apachekafka、AmazonKinesisStreams、RabbitMQ、TwitterStreamingAPI、ApacheNiFi等,当然你也可以定义自己的source。
2、Transformation:数据转换的各种操作,有Map/FlatMap/Filter/KeyBy/Reduce/Fold/Aggregations/Window/WindowAll/Union/Windowjoin/Split/Select/Project等,操作很多,可以将数据转换计算成你想要的数据。
3、Sink:接收器,Flink将转换计算后的数据发送的地点,你可能需要存储下来,Flink常见的Sink大概有如下几类:写入文件、打印出来、写入socket、自定义的sink。自定义的sink常见的有Apachekafka、RabbitMQ、MySQL、ElasticSearch、ApacheCassandra、HadoopFileSystem等,同理你也可以定义自己的Sink。
2.Transformation(数据转换)(1)Map这是最简单的转换之一,其中输入是一个数据流,输出的也是一个数据流:
将每个人的年龄都增加5岁,其他不变。
(2)FlatMapFlatMap采用一条记录并输出零个,一个或多个记录。
这里将id为偶数的聚集出来。
(3)FilterFilter函数根据条件判断出结果。
这里将id大于95的过滤出来,然后打印出来。
(4)KeyByKeyBy在逻辑上是基于key对流进行分区。在内部,它使用hash函数对流进行分区。它返回KeyedDataStream数据流。
上面对student的age做KeyBy操作分区
(5)ReduceReduce返回单个的结果值,并且reduce操作每处理一个元素总是创建一个新值。常用的方法有average,sum,min,max,count,使用reduce方法都可实现。
上面先将数据流进行keyby操作,因为执行reduce操作只能是KeyedStream,然后将student对象的age做了一个求平均值的操作。
(6)FoldFold通过将最后一个文件夹流与当前记录组合来推出KeyedStream。它会发回数据流。
("1",newFoldFunctionInteger,String(){@OverridepublicStringfold(Stringaccumulator,Integervalue)throwsException{returnaccumulator+"="+value;}})(7)AggregationsDataStreamAPI支持各种聚合,例如min,max,sum等。这些函数可以应用于KeyedStream以获得Aggregations聚合。
(0)("key")(0)("key")(0)("key")(0)("key")(0)("key")max和maxBy之间的区别在于max返回流中的最大值,但maxBy返回具有最大值的键,min和minBy同理。
(8)WindowWindow函数允许按时间或其他条件对现有KeyedStream进行分组。以下是以10秒的时间窗口聚合:
(0).window((10));
Flink定义数据片段以便(可能)处理无限数据流。这些切片称为窗口。此切片有助于通过应用转换处理数据块。要对流进行窗口化,我们需要分配一个可以进行分发的键和一个描述要对窗口化流执行哪些转换的函数
要将流切片到窗口,我们可以使用Flink自带的窗口分配器。我们有选项,如tumblingwindows,slidingwindows,global和sessionwindows。Flink还允许您通过扩展WindowAssginer类来编写自定义窗口分配器。这里先预留下篇文章来讲解这些不同的windows是如何工作的。
(9)WindowAllwindowAll函数允许对常规数据流进行分组。通常,这是非并行数据转换,因为它在非分区数据流上运行。
与常规数据流功能类似,我们也有窗口数据流功能。唯一的区别是它们处理窗口数据流。所以窗口缩小就像Reduce函数一样,Windowfold就像Fold函数一样,并且还有聚合。
(0).windowAll((10));(10)Union
Union函数将两个或多个数据流结合在一起。这样就可以并行地组合数据流。如果我们将一个流与自身组合,那么它会输出每个记录两次。
(inputStream1,inputStream2,);(10)Windowjoin
我们可以通过一些key将同一个window的两个数据流join起来。
(inputStream1).where(0).equalTo(1).window((5)).apply(newJoinFunction(){});以上示例是在5秒的窗口中连接两个流,其中第一个流的第一个属性的连接条件等于另一个流的第二个属性。
(11)Split此功能根据条件将流拆分为两个或多个流。当您获得混合流并且您可能希望单独处理每个数据流时,可以使用此方法。
SplitStreamIntegersplit=(newOutputSelectorInteger(){@OverridepublicIterableStringselect(Integervalue){ListStringoutput=newArrayListString();if(value%2==0){("even");}else{("odd");}returnoutput;}});(12)Select此功能允许您从拆分流中选择特定流。
SplitStreamIntegersplit;DataStreamIntegereven=("even");DataStreamIntegerodd=("odd");DataStreamIntegerall=("even","odd");(13)ProjectProject函数允许您从事件流中选择属性子集,并仅将所选元素发送到下一个处理流。
DataStreamTuple4Integer,Double,String,Stringin=//[]DataStreamTuple2String,Stringout=(3,2);
上述函数从给定记录中选择属性号2和3。以下是示例输入和输出记录:
(1,10.0,A,B)=(B,A)(2,20.0,C,D)=(D,C)最后
本文主要介绍了FlinkData的常用转换方式:Map、FlatMap、Filter、KeyBy、Reduce、Fold、Aggregations、Window、WindowAll、Union、WindowJoin、Split、Select、Project等。具体在项目中该如何将数据流转换成我们想要的格式,还需要根据实际情况对待