反洗钱系统从收付费系统获取大额、可疑交易信息。而跨境支付反洗钱分析业务则以多国的交易数据为核心,关联交易双方所在国家、交易柜台所在国家、国家的风险等级、交易频率、交易金额等综合因素考虑是否可能涉及洗钱,并以国家所在的大洲(如亚洲、非洲、北美洲等)来分组统计。
具体是根据数据科学家通过对历史交易数据和各种相关维度信息的分析得到的模型和参数,筛选出可能涉及到洗钱行为的帐号,然后对账号的可疑操作进行监控。
技术上,将交易数据、帐号信息和相关维度定期地从交易系统中导出为数据文件,将文件传输到Hadoop集群的HDFS文件系统中,通过Hive外部表连接到数据文件,然后使用Spark或Flink大数据计算引擎对数据进行清洗。过程分为三个步骤,首先将这些Hive外部表转换为Hive内部表以提高Hive表的读写性能,然后将按反洗钱数据分析的业务逻辑对数据进行清洗和聚合,以便得到各种与帐号属性和交易金额以及频率相关的统计数据,最后将得到的统计数据存储在Hive表中并做下钻分析。
考虑到跨境支付每天产生的交易数据的数据量较大,同一笔记录有时也会有更新,所以交易数据会每天以增量数据的形式写入Hive表以日期命名分区,这样就会产生很多重复的记录,需要进行去重操作。而去重操作一般通过开窗函数row_number()和筛选操作来实现,而且这是全表扫描。这中间有一点比较麻烦,就是当我们选取一个比较长的时间段来作为导入源数据的时候,比如一年的交易数据,它的数据量就有可能会大于集群中所有内存容量之和,跑一次就会出现内存溢出的情况。这个时候我们可以分割一年数据到12个月数据跑去重,每一次跑完就落地磁盘,得到12个月最新数据。然后将12个月的数据合并,再跑一次去重操作,就可以得到一年内最新的交易数据了。这样每次进行计算作业,集群资源的占用就减少了,不会出现内存溢出的现象,同时牺牲了更多的CPU资源,实现了时间换取空间。