Flink 中Operators(操作符)及示例代码

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

猜你喜欢

转载自blog.csdn.net/gym02/article/details/105921503