Flink之用户行为分析之两条流的订单交易匹配


订单交易匹配

对于订单支付事件,用户支付完成其实并不算完,我们还得确认平台账户上是否到账了。而往往这会来自不同的日志信息,所以我们要同时读入两条流的数据来做合并 处 理 。 这 里 我 们 利 用 connect 将两 条 流 进 行 连 接 , 然 后 用 自 定 义 的CoProcessFunction 进行处理。

case class OrderEvent( orderId: Long, eventType: String, txId: String, eventTime: Long )
case class ReceiptEvent( txId: String, payChannel: String, eventTime: Long )
object TxMatch {
 val unmatchedPays = new OutputTag[OrderEvent]("unmatchedPays")
 val unmatchedReceipts = new OutputTag[ReceiptEvent]("unmatchedReceipts")
 def main(args: Array[String]): Unit = {
 val env = StreamExecutionEnvironment.getExecutionEnvironment
 env.setParallelism(1)
 env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
 val orderEventStream = env.readTextFile("YOUR_PATH\\resources\\OrderLog.csv")
.map( data => {
val dataArray = data.split(",")
OrderEvent(dataArray(0).toLong, dataArray(1), dataArray(2),
dataArray(3).toLong)
})
.filter(_.txId != "")
 .assignAscendingTimestamps(_.eventTime * 1000L)
 .keyBy(_.txId)
 val receiptEventStream = env.readTextFile("YOUR_PATH\\resources\\ReceiptLog.csv")
.map( data => {
val dataArray = data.split(",")
ReceiptEvent(dataArray(0), dataArray(1), dataArray(2).toLong)
})
 .assignAscendingTimestamps(_.eventTime * 1000L)
 .keyBy(_.txId)
 val processedStream = orderEventStream
 .connect(receiptEventStream)
 .process(new TxMatchDetection)
 processedStream.getSideOutput(unmatchedPays).print("unmatched pays")
 processedStream.getSideOutput(unmatchedReceipts).print("unmatched receipts")
 processedStream.print("processed")
 env.execute()
 }
 class TxMatchDetection extends CoProcessFunction[OrderEvent, ReceiptEvent, 
(OrderEvent, ReceiptEvent)]{
 lazy val payState: ValueState[OrderEvent] = getRuntimeContext.getState(new 
ValueStateDescriptor[OrderEvent]("pay-state",classOf[OrderEvent]) )
lazy val receiptState: ValueState[ReceiptEvent] = getRuntimeContext.getState(new 
ValueStateDescriptor[ReceiptEvent]("receipt-state", classOf[ReceiptEvent]) )
 override def processElement1(pay: OrderEvent, ctx: CoProcessFunction[OrderEvent, 
ReceiptEvent, (OrderEvent, ReceiptEvent)]#Context, out: Collector[(OrderEvent, 
ReceiptEvent)]): Unit = {
 val receipt = receiptState.value()
 if( receipt != null ){
 receiptState.clear()
 out.collect((pay, receipt))
 } else{
 payState.update(pay)
 ctx.timerService().registerEventTimeTimer(pay.eventTime * 1000L)
 }
 }
 override def processElement2(receipt: ReceiptEvent, ctx: 
CoProcessFunction[OrderEvent, ReceiptEvent, (OrderEvent, ReceiptEvent)]#Context, out: 
Collector[(OrderEvent, ReceiptEvent)]): Unit = {
 val payment = payState.value()
 if( payment != null ){
 payState.clear()
 out.collect((payment, receipt))
 } else{
 receiptState.update(receipt)
 ctx.timerService().registerEventTimeTimer(receipt.eventTime * 1000L)
 }
}
 override def onTimer(timestamp: Long, ctx: CoProcessFunction[OrderEvent, 
ReceiptEvent, (OrderEvent, ReceiptEvent)]#OnTimerContext, out: Collector[(OrderEvent, 
ReceiptEvent)]): Unit = {
 if ( payState.value() != null ){
 ctx.output(unmatchedPays, payState.value())
 }
 if ( receiptState.value() != null ){
 ctx.output(unmatchedReceipts, receiptState.value())
 }
 payState.clear()
 receiptState.clear()
 }
 }
}

总结

代码理解:两条流的输入,一条是orderEvent,一条是接收流ReceiptEvent。对于订单事件流,先做filter操作,过滤出不为空的事件,再根据txId进行keyBy。对于支付到账事件流,先按照时间流升序排序,再同样根据Id进行KeyBy,如果两个id对的上,那么就是成功到账信息,则可以进行输出。如果一个没有,另一个有,则输出报警信息,用cenect将两条流数据连接起来共同处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用户画像作为大数据的根基,它抽象出一个用户的信息全貌,为进一步精准、快速地分析用户行为习惯、消费习惯等重要信息,提供了足够的数据基础,奠定了大数据时代的基石。 用户画像,即用户信息标签化,就是企业通过收集与分析消费者社会属性、生活习惯、消费行为等主要信息的数据之后,抽象出一个用户的商业全貌作是企业应用大数据技术的基本方式。用户画像为企业提供了足够的信息基础,能够帮助企业快速找到精准用户群体以及用户需求等更为广泛的反馈信息。 用户画像系统能很好地帮助企业分析用户的行为与消费习惯,可以预测商品的发展的趋势,提高产品质量,同时提高用户满意度。构建一个用户画像,包括数据源端数据收集、数据预处理、行为建模、构建用户画像。有些标签是可以直接获取到的,有些标签需要通过数据挖掘分析到!本套课程会带着你一步一步的实现用户画像案例,掌握了本套课程内容,可以让你感受到Flink+ClickHouse技术架构的强大和大数据应用的广泛性。 在这个数据爆发的时代,像大型电商的数据量达到百亿级别,我们往往无法对海量的明细数据做进一步层次的预聚合,大量的业务数据都是好几亿数据关联,并且我们需要聚合结果能在秒级返回。 包括我们的画像数据,也是有这方便的需求,那怎么才能达到秒级返回呢?ClickHouse正好满足我们的需求,它是非常的强大的。 本课程采用Flink+ClickHouse技术架构实现我们的画像系统,通过学习完本课程可以节省你摸索的时间,节省企业成本,提高企业开发效率。希望本课程对一些企业开发人员和对新技术栈有兴趣的伙伴有所帮助,如对我录制的教程内容有建议请及时交。项目中采用到的算法包含Logistic Regression、Kmeans、TF-IDF等,Flink暂时支持的算法比较少,对于以上算法,本课程将带大家用Flink实现,并且结合真实场景,学完即用。系统包含所有终端的数据(移动端、PC端、小程序端),支持亿级数据量的分析和查询,并且是实时和近实时的对用户进行画像计算。本课程包含的画像指标包含:概况趋势,基础属性,行为特征,兴趣爱好,风险特征,消费特征,营销敏感度,用户标签信息,用户群里,商品关键字等几大指标模块,每个指标都会带大家实现。课程所涵盖的知识点包括:开发工具为:IDEA FlinkClickhouseHadoopHbaseKafkaCanalbinlogSpringBootSpringCloudHDFSVue.jsNode.jsElemntUIEcharts等等 课程亮点: 1.企业级实战、真实工业界产品 2.ClickHouse高性能列式存储数据库 3.提供原始日志数据进行效果检测 4.Flink join企业级实战演练 5.第四代计算引擎Flink+ClickHouse技术架构6.微服务架构技术SpringBoot+SpringCloud技术架构7.算法处理包含Logistic Regression、Kmeans、TF-IDF等8.数据库实时同步落地方案实操9.统计终端的数据(移动端、PC端、小程序端) 10.支撑亿级海量数据的用户画像平台11.实时和近实时的对用户进行画像计算12.后端+大数据技术栈+前端可视化13.提供技术落地指导支持 14.课程凝聚讲师多年实战经验,经验直接复制15.掌握全部内容能独立进行大数据用户平台的设计和实操企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。 
好的,针对电商用户行为分析Flink 代码解析,我可以提供一些简单的示例代码和解释,供您参考。 首先,我们需要定义用户行为数据的数据模型,通常包括用户 ID、行为类型、商品 ID、时间戳等字段。示例代码如下: ```java public class UserBehavior { public long userId; public long itemId; public int categoryId; public String behavior; public long timestamp; } ``` 接下来,我们使用 Flink 处理框架来实时处理和分析用户行为数据。示例代码如下: ```java // 创建数据源,从 Kafka 中读取用户行为数据 FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>("user-behavior", new SimpleStringSchema(), properties); DataStream<String> stream = env.addSource(consumer); // 将用户行为数据转换为 UserBehavior 对象 DataStream<UserBehavior> behaviorStream = stream.map(new MapFunction<String, UserBehavior>() { @Override public UserBehavior map(String value) throws Exception { JSONObject json = JSONObject.parseObject(value); return new UserBehavior( json.getLong("user_id"), json.getLong("item_id"), json.getInteger("category_id"), json.getString("behavior"), json.getLong("timestamp") ); } }); // 过滤出浏览行为,并进行分组聚合 DataStream<Tuple2<Long, Long>> pvStream = behaviorStream .filter(new FilterFunction<UserBehavior>() { @Override public boolean filter(UserBehavior behavior) throws Exception { return behavior.behavior.equals("pv"); } }) .map(new MapFunction<UserBehavior, Tuple2<Long, Long>>() { @Override public Tuple2<Long, Long> map(UserBehavior behavior) throws Exception { return new Tuple2<>(behavior.itemId, 1L); } }) .keyBy(0) .sum(1); // 输出结果到控制台 pvStream.print(); ``` 以上代码实现了从 Kafka 中读取用户行为数据,将数据转换为 UserBehavior 对象,过滤出浏览行为,并按商品 ID 进行分组聚合,最后将结果输出到控制台。 当然,电商用户行为分析还涉及到很多其他的问题和场景,如购买转化率分析、用户活跃度分析、商品热度排名分析等等。针对不同的问题和场景,需要进行不同的数据处理和分析。希望这个示例代码能够帮助您理解 Flink 在电商用户行为分析中的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值