Transformations(转换)
DataStream → DatasTREAM
Map
获取一个元素并生成一个元素。将输入流的值加倍的映射函数:
dataStream.map( x => x * 2)
FlatMap
接受一个元素并生成零个、一个或多个元素。将句子分割成单词的平面图功能:
dataStream.flatMap(str => str.split(" "))
Filter
为每个元素计算一个布尔函数,并保留那些函数返回true的元素。过滤零值的过滤器:
dataStream.filter(_!=0)
env.socketTextStream("Flink",9999)
.map(line => line.split("\\s+"))
.map(ts => ts(0),ts(1),ts(2).toInt,ts(3))
.filter(_._3 => 18)
.flatMap(t=> t._4.split(",").map(item => (t._1,t._2,t._3,item)))
.print()
DataStream* → DataStream
Union
两个或多个数据流的合并,创建一个包含所有流中所有元素的新流。注意:如果你把一个数据流和它自己结合起来,你将在结果流中得到每个元素两次。参与Union的Datastream的元素类型必须一致。
dataStream.union(otherStream1,otherStream2,...)
val Stream1 = env.socketTextStream("Flink",9999)
val Stream2 = env.socketTextStream("Flink",9999)
stream1.union(Stream2)
.map(line => line.split("\\s+"))
.map(ts => ts(0),ts(1),ts(2).toInt,ts(3))
.filter(_._3 >= 18)
.flatMap(t => t._4.split(",").map(item=>(t._1,t._2.t_3,item)))
.print()
DataStream,DataStream → ConnectedStraems
Connect
“Connects
”两个保留其类型的数据流,允许两个数据流之间共享状态。参与连接的DataStream的元素类型可以不一致。
someStream : DataStream[Int]=...
otherStream : DataStream[String]=...
val connectedStreams = someStream.connect(otherStream)
ConnectedStreams → DataStream
CoMap,CoFlatMap
类似于连接的数据流上的映射和平面映射。
connectedStreams.map(
(_ : Int) => true,
(_ : String => flase)
)
connectedStreams.flatMap(
(_ : Int) => true,
(_ : String) => flase
)
//zhangsan 4.5 1 apple
val stream1 = env.socketTextStream("Flink",9999)
//apple zhangsan 2 4.5
val stream2 = env.socketTextStream("Flink",8888)
stream1.connect(stream2)
.map((line:String)=> {
val ts = line.split("\\s+")
(ts(0),ts(3),ts(1).toDouble*ts(2).toInt)
},(line:String)=> {
val ts = line.split("\\s+")
(ts(1),ts(0),ts(3).toDouble*ts(2).toInt)
})
.print()
DataStream → SplitStream
Split
根据某种标准将流分成两个或多个流。
val split = someDataStream.split{
(num : Int) =>
(num % 2) match{
case 0 => List("even")
case 1 => List("odd")
}
}
SplitStream → DataStream
Select
从拆分的流中选择一个或多个流。
val env = StreamExecutionEnvironment.getExecytionEnvironment
var splitStream = env.socketTextStraem("Flink",9999)
.split(new OutputSelector[String]{
override def select(value: String): lang.Iterable[String] = {
var tag=new util.ArrayList[String]()
if(value.contains("ERROR")){
tag.add("ERROR")
}else{
tag.add("INFO")
}
tag
}
})
splitStraem.select("INFO").print("INFO")
splitStream.select("ERROR").print("ERROR")
env.execute("SplitDataStreamOperators")
由于split已经失效了,因此flink推荐使用sideout获取数据。
val env = StreamExecutionEnvironment.getExecutionEnvironment
//定义标记
val tag = new OutputTag[String]("errorTag")
var dataStream:DataStream[String]=env.socketTextStream("CentOS", 9999)
.process(new ProcessFunction[String,String] {
override def processElement(value: String,
ctx: ProcessFunction[String, String]#Context,
out: Collector[String]): Unit = {
//将数据写到side中
if(value.contains("ERROR")){
ctx.output(tag,value)
}else{
//将数据正常输送给下游
out.collect(value)
}
}
})
dataStream.print("正常")
//获取side信息
dataStream.getSideOutput(tag).printToErr("错误")
env.execute("SideOutDataStreamOperators")
DataStream → KeyedStream
KeyBy
在逻辑上将一个流划分成不相交的分区,每个分区包含相同键的元素。在内部,这是通过哈希分区实现的。有关如何指定密钥,请参见密钥。该转换返回一个KeyedStream。
dataStream.keyBy("someKey")
dataStream.keyBy(0)
KeyedStream → DataStream
Reduce
键控数据流上的“滚动”缩减。将当前元素与最后一个减少的值合并,并发出新值。一种生成部分和流的归约函数:
keyedStream.reduce {
_ + _}
env.socketTextStream("Flink",9999)
.flatMap(line => line.split("\\s+"))
.map(word => (word,1))
.keyBy("_1")
.reduce((v1,v2)=>(v1._1,v1._2+v2._2))
.print("输出")
Fold
带初始值的键控数据流上的“滚动”折叠。将当前元素与最后一个折叠值合并,并发出新值。i
一种折叠函数,当应用于序列(1,2,3,4,5)时,发出序列“start-1”,“start-1-2”,“start-1-2-3”,…
val result : DataStream[String] =
keyedStream.fold("start")((str, i) => {
str + "-" + i})
env.socketTextStream("Flink", 9999)
.flatMap(line=>line.split("\\s+"))
.map(word=>(word,1))
.keyBy("_1")
.fold(("",0))((v1,v2)=>(v2._1,v1._2+v2._2))
.print("输出")
Aggregations
在键控数据流上滚动聚合。min和minBy的区别在于min返回最小值,而minBy返回该字段中具有最小值的元素(最大值和最大值相同)。
keyedStream.sum(0)
keyedStream.sum("key")
keyedStream.min(0)
keyedStream.min("key")
keyedStream.max(0)
keyedStream.max("key")
keyedStream.minBy(0)
keyedStream.minBy("key")
keyedStream.maxBy(0)
keyedStream.maxBy("key")
//张三 研发 10000
//lisi 研发 800
env.socketTextStream("Flink", 9999)
.map(line=>line.split("\\s+"))
.map(ts=>(ts(0),ts(1),ts(2).toDouble))
.keyBy(1)
.min("_3")
.print("输出") //张三 研发 800