到账时间比下单时间早三秒,晚5秒 两条流合并
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.functions.co.ProcessJoinFunction
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.util.Collector
// 定义下单事件,到账事件样例类
case class OrderEvent(orderId: Long, eventType: String, txId: String, timestamp: Long)
case class ReceiptEvent(txId: String, payChannel: String, timestamp: Long) //txId 交易流水号
object TxMatchWithJoin {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
// 1. 读取订单事件数据
val orderEventStream = env.readTextFile("D:\\Mywork\\workspace\\Project_idea\\UserBehaviorAnalysis0903\\OrderPayDetect\\src\\main\\resources\\OrderLog.csv")
.map( data => {
val arr = data.split(",")
OrderEvent(arr(0).toLong, arr(1), arr(2), arr(3).toLong)
} )
.assignAscendingTimestamps(_.timestamp * 1000L)
.filter(_.eventType == "pay")
.keyBy(_.txId)
// 2. 读取到账事件数据
val receiptEventStream = env.readTextFile("D:\\Mywork\\workspace\\Project_idea\\UserBehaviorAnalysis0903\\OrderPayDetect\\src\\main\\resources\\ReceiptLog.csv")
.map( data => {
val arr = data.split(",")
ReceiptEvent(arr(0), arr(1), arr(2).toLong)
} )
.assignAscendingTimestamps(_.timestamp * 1000L)
.keyBy(_.txId)
val resultStream = orderEventStream.intervalJoin(receiptEventStream)
.between(Time.seconds(-3), Time.seconds(5)) //到账时间 可以比 下单时间 早三秒,晚5秒
.process(new TxMatchWithJoinResult())
resultStream.print()
env.execute("tx match with join job")
}
}
class TxMatchWithJoinResult() extends ProcessJoinFunction[OrderEvent, ReceiptEvent, (OrderEvent, ReceiptEvent)]{
override def processElement(left: OrderEvent, right: ReceiptEvent, ctx: ProcessJoinFunction[OrderEvent, ReceiptEvent, (OrderEvent, ReceiptEvent)]#Context, out: Collector[(OrderEvent, ReceiptEvent)]): Unit = {
out.collect((left, right))
}
}
// 输出结果
(OrderEvent(34729,pay,sd76f87d6,1558430844),ReceiptEvent(sd76f87d6,wechat,1558430847)) 晚3秒
(OrderEvent(34730,pay,3hu3k2432,1558430845),ReceiptEvent(3hu3k2432,alipay,1558430848))
(OrderEvent(34746,pay,3243hr9h9,1558430895),ReceiptEvent(3243hr9h9,wechat,1558430892)) 早三秒
(OrderEvent(34747,pay,329d09f9f,1558430893),ReceiptEvent(329d09f9f,alipay,1558430893))