Jig*_*ekh 7 java scala apache-spark shark-sql spark-streaming
我正在构建用于检测欺诈ATM卡交易的实时处理.为了有效地检测欺诈,逻辑要求按卡分配最后交易日期,交易金额按天(或最后24小时)计算.
其中一个用例是,如果在该国家/地区之外的卡片交易超过该国家最后一次交易的30天,则会发送警报作为可能的欺诈行为
所以试着将Spark流视为一种解决方案.为了实现这一目标(可能我对功能编程缺乏了解),下面是我的psudo代码
stream=ssc.receiverStream() //input receiver
s1=stream.mapToPair() // creates key with card and transaction date as value
s2=stream.reduceByKey() // applies reduce operation for last transaction date
s2.checkpoint(new Duration(1000));
s2.persist();
Run Code Online (Sandbox Code Playgroud)
我这里面临两个问题
1)如何进一步使用这个最后的交易日期以便将来从同一张卡进行比较
2)如何保持数据所以即使重启驱动程序然后s2的旧值恢复回来3)updateStateByKey
可以用来维持历史状态?
我想我错过了如何实现这种逻辑的火花流/函数编程的关键点.
如果您使用 Spark Streaming,则实际上不应该将状态保存在文件中,特别是如果您计划 24/7 运行应用程序。如果这不是您的意图,那么您可能只需要一个 Spark 应用程序就可以了,因为您只面临大数据计算,而不是实时的批量计算。
是的, updateStateByKey 可用于通过各个批次维护状态,但它有一个特定的签名,您可以在文档中看到: http ://spark.apache.org/docs/latest/api/scala/index.html#org .apache.spark.streaming.dstream.PairDStreamFunctions
另外 persist() 它只是一种缓存形式,它实际上并不将数据保存在磁盘上(就像文件一样)。
希望能解答您的一些疑惑。