图数据驱动的金融欺诈团伙检测数仓实践

以账户、设备、IP 等实体为节点,以交易关系和登录绑定为边,构建实体关系图谱,识别欺诈团伙和黑市环网。本文以 20 个账户节点、10 个设备节点、10 个 IP 节点、25 条交易边为数据集,端到端演示 ODS → DWD → DWS → ADS 四层数仓的完整构建过程,覆盖 MERGE INTO 增量边表更新、Dynamic Table 聚合、SQL UDF 团伙风险评分、Bloomfilter Index 高效点查等核心能力。


概述

金融欺诈团伙检测的典型数据链路是:账户注册/交易数据实时接入 → 原始节点/边存储(ODS)→ 共设备/交易关系建边(DWD)→ 团伙统计与风险评分(DWS)→ 高风险账户黑名单输出(ADS)

云器 Lakehouse 通过以下组合解决几个核心问题:

问题解决方案
账户共用同一设备是团伙关联的最强信号MERGE INTO 增量维护账户-设备关联边表,不漏不重
交易图谱节点数量巨大,跨节点聚合慢Dynamic Table 自动增量维护 DWD/DWS 聚合结果
风险评分逻辑需复用于多个下游系统SQL UDF 封装多因子加权评分公式
device_id 高基数,按设备查关联账户频繁Bloomfilter Index 精确过滤,降低全表扫描开销
IP 城市/运营商字段需关键字检索Inverted Index 加速 city 列精确匹配
Graph 算法(社区检测、PageRank)超出 SQL 能力ZettaPark Python Task + NetworkX 运行图算法

涉及的 SQL 命令

命令 / 函数用途说明
CREATE TABLE
CREATE TABLE
建 ODS 层节点表和边表普通表,作为 Dynamic Table 上游
CREATE BLOOMFILTER INDEX
CREATE BLOOMFILTER INDEX
src_account_id
src_account_id
device_id
device_id
列创建过滤索引
适合高基数列的点查过滤
CREATE INVERTED INDEX
CREATE INVERTED INDEX
在 IP 节点
city
city
列创建关键字索引
精确匹配城市维度过滤
MERGE INTO
MERGE INTO
增量更新账户-设备关联边表按主键 upsert,避免重复边
CREATE FUNCTION
CREATE FUNCTION
创建团伙风险评分 UDF
calc_gang_risk_score
calc_gang_risk_score
封装多因子加权评分公式
CREATE DYNAMIC TABLE
CREATE DYNAMIC TABLE
创建 DWD / DWS / ADS 层增量计算表系统自动识别上游变更并增量刷新
REFRESH DYNAMIC TABLE
REFRESH DYNAMIC TABLE
手动触发一次刷新首次构建或调试时使用

前置准备

本文所有示例在

best_practice_fraud_graph
best_practice_fraud_graph
Schema 下运行。

CREATE SCHEMA IF NOT EXISTS best_practice_fraud_graph;


ODS 层:原始节点与边表

建表

-- 账户节点:记录每个账户的注册信息和风险标签 CREATE TABLE IF NOT EXISTS best_practice_fraud_graph.doc_account_node ( account_id STRING, register_time TIMESTAMP, register_ip STRING, phone_tail STRING, id_cert_hash STRING, account_age_days INT, is_verified INT, risk_label INT -- 0: 正常 1: 已知欺诈 ); -- 设备节点:记录设备基础属性 CREATE TABLE IF NOT EXISTS best_practice_fraud_graph.doc_device_node ( device_id STRING, device_type STRING, os_type STRING, first_seen TIMESTAMP, account_count INT ); -- IP 节点:记录 IP 基础属性和风险评分 CREATE TABLE IF NOT EXISTS best_practice_fraud_graph.doc_ip_node ( ip_addr STRING, isp STRING, city STRING, risk_score DOUBLE, account_count INT ); -- 交易边:账户间的资金转移关系 CREATE TABLE IF NOT EXISTS best_practice_fraud_graph.doc_transaction_edge ( txn_id STRING, src_account_id STRING, dst_account_id STRING, amount DOUBLE, txn_time TIMESTAMP, channel STRING, status STRING, is_suspicious INT ); -- 账户-设备关联边:账户登录设备的绑定关系 CREATE TABLE IF NOT EXISTS best_practice_fraud_graph.doc_account_device_edge ( account_id STRING, device_id STRING, first_seen TIMESTAMP, last_seen TIMESTAMP, login_count INT );

创建 Bloomfilter Index 和 Inverted Index

doc_transaction_edge.src_account_id
doc_transaction_edge.src_account_id
doc_account_device_edge.device_id
doc_account_device_edge.device_id
均为高基数列,点查频繁,适合 Bloomfilter Index。

-- 交易边:按发起账户精确过滤 CREATE BLOOMFILTER INDEX IF NOT EXISTS best_practice_fraud_graph.idx_bf_txn_src ON TABLE best_practice_fraud_graph.doc_transaction_edge (src_account_id); -- 账户-设备边:按设备 ID 精确过滤 CREATE BLOOMFILTER INDEX IF NOT EXISTS best_practice_fraud_graph.idx_bf_device_id ON TABLE best_practice_fraud_graph.doc_account_device_edge (device_id); -- IP 节点:按城市关键字精确匹配 CREATE INVERTED INDEX IF NOT EXISTS best_practice_fraud_graph.idx_inv_city ON TABLE best_practice_fraud_graph.doc_ip_node (city) PROPERTIES ('analyzer'='keyword');

写入模拟数据

本文使用 INSERT 直接构造实体关系数据,模拟账户注册、登录绑定和资金转移:

从本地 CSV 导入数据(推荐):

-- 第一步:通过 SQL PUT 将本地 CSV 文件上传到 User Volume PUT '/path/to/your/doc_account_node.csv' TO USER VOLUME FILE 'doc_account_node.csv';

-- 第二步:从 User Volume COPY INTO 表 COPY INTO best_practice_fraud_graph.doc_account_node FROM USER VOLUME USING csv OPTIONS('header'='true', 'sep'=',', 'nullValue'='') FILES ('doc_account_node.csv');

也可直接内联插入小批量测试数据(不需要 CSV 文件):

-- 写入 20 个账户节点(A001–A020) INSERT INTO best_practice_fraud_graph.doc_account_node VALUES ('A001', CAST('2025-01-10 09:00:00' AS TIMESTAMP), '192.168.10.1', '8801', 'hash_id_001', 147, 1, 0), ('A002', CAST('2025-01-10 09:05:00' AS TIMESTAMP), '192.168.10.1', '8802', 'hash_id_002', 147, 1, 1), ('A003', CAST('2025-01-10 09:10:00' AS TIMESTAMP), '192.168.10.1', '8803', 'hash_id_003', 147, 0, 1), -- ... A004–A020(完整 20 条) ;

验证 ODS 层行数:

SELECT COUNT(*) AS account_count FROM best_practice_fraud_graph.doc_account_node;

account_count ------------- 20

SELECT COUNT(*) AS txn_count FROM best_practice_fraud_graph.doc_transaction_edge; SELECT COUNT(*) AS edge_count FROM best_practice_fraud_graph.doc_account_device_edge;

txn_count --------- 25 edge_count ---------- 20

数据结构说明:模拟数据中,A001/A002/A003 三个账户在注册时均使用了同一 IP

192.168.10.1
192.168.10.1
,且通过同一台设备 D001 登录;A001、A002、A003 之间存在多笔快速转账交易,
is_suspicious=1
is_suspicious=1
。这构成一个典型的欺诈团伙模式。

通过 MERGE INTO 增量更新边表

在生产环境中,新的登录事件持续产生,账户与设备的绑定关系需要增量更新而非全量替换。MERGE INTO 可以在发现已有

(account_id, device_id)
(account_id, device_id)
组合时更新
last_seen
last_seen
login_count
login_count
,首次出现时插入新行:

MERGE INTO best_practice_fraud_graph.doc_account_device_edge AS t USING ( SELECT 'A001' AS account_id, 'D001' AS device_id, CAST('2025-06-01 10:00:00' AS TIMESTAMP) AS last_seen, 1 AS new_logins ) AS s ON t.account_id = s.account_id AND t.device_id = s.device_id WHEN MATCHED THEN UPDATE SET last_seen = s.last_seen, login_count = t.login_count + s.new_logins WHEN NOT MATCHED THEN INSERT (account_id, device_id, first_seen, last_seen, login_count) VALUES (s.account_id, s.device_id, s.last_seen, s.last_seen, s.new_logins);


团伙风险评分 UDF

将多因子团伙风险评分逻辑封装为 SQL UDF,DWS 和 ADS 层均可复用。

评分公式:可疑交易率×40 + 共设备账户对数×30(≥2 对满分,=1 对 15 分)+ 注册 IP 风险×20 + 未实名认证+10,上限 100,下限 0。

CREATE OR REPLACE FUNCTION best_practice_fraud_graph.calc_gang_risk_score( suspicious_rate DOUBLE, shared_device_pairs INT, ip_risk_score DOUBLE, is_verified INT ) RETURNS DOUBLE AS GREATEST(0.0, LEAST(100.0, suspicious_rate * 40.0 + CASE WHEN shared_device_pairs >= 2 THEN 30.0 WHEN shared_device_pairs = 1 THEN 15.0 ELSE 0.0 END + ip_risk_score * 20.0 + CASE WHEN is_verified = 0 THEN 10.0 ELSE 0.0 END ));

验证函数——高风险账户(可疑率 100%、共用 2 个设备对、高风险 IP、未实名):

SELECT best_practice_fraud_graph.calc_gang_risk_score(1.0, 2, 0.85, 0) AS sample_score;

sample_score ------------ 97

该账户评分 97 分,属于 HIGH 风险区间,系统可直接拦截。


DWD 层 Dynamic Table:关系图谱边表

DWD 层做两件事:第一,将账户-设备关联边 SELF JOIN 找出"共设备账户对";第二,将交易边与账户节点 JOIN 补充双方的 IP 风险信息。

共设备账户对

CREATE DYNAMIC TABLE IF NOT EXISTS best_practice_fraud_graph.dwd_shared_device_pairs AS SELECT a1.account_id AS account_id_1, a2.account_id AS account_id_2, a1.device_id AS shared_device_id, a1.login_count AS login_count_1, a2.login_count AS login_count_2, LEAST(a1.last_seen, a2.last_seen) AS last_shared_time FROM best_practice_fraud_graph.doc_account_device_edge a1 JOIN best_practice_fraud_graph.doc_account_device_edge a2 ON a1.device_id = a2.device_id AND a1.account_id < a2.account_id;

交易图谱边(含风险标签)

CREATE DYNAMIC TABLE IF NOT EXISTS best_practice_fraud_graph.dwd_txn_graph_edge AS SELECT t.txn_id, t.src_account_id, t.dst_account_id, t.amount, t.txn_time, t.channel, t.status, t.is_suspicious, a_src.register_ip AS src_register_ip, a_dst.register_ip AS dst_register_ip, a_src.risk_label AS src_risk_label, a_dst.risk_label AS dst_risk_label FROM best_practice_fraud_graph.doc_transaction_edge t JOIN best_practice_fraud_graph.doc_account_node a_src ON t.src_account_id = a_src.account_id JOIN best_practice_fraud_graph.doc_account_node a_dst ON t.dst_account_id = a_dst.account_id;

手动触发首次刷新:

REFRESH DYNAMIC TABLE best_practice_fraud_graph.dwd_shared_device_pairs; REFRESH DYNAMIC TABLE best_practice_fraud_graph.dwd_txn_graph_edge; SELECT COUNT(*) AS pair_count FROM best_practice_fraud_graph.dwd_shared_device_pairs; SELECT COUNT(*) AS edge_count FROM best_practice_fraud_graph.dwd_txn_graph_edge;

pair_count ---------- 11 edge_count ---------- 25

查看 D001 设备下的账户对——这是最典型的团伙特征:

SELECT account_id_1, account_id_2, shared_device_id, login_count_1, login_count_2 FROM best_practice_fraud_graph.dwd_shared_device_pairs WHERE shared_device_id = 'D001';

account_id_1 | account_id_2 | shared_device_id | login_count_1 | login_count_2 -------------+--------------+------------------+---------------+-------------- A001 | A003 | D001 | 35 | 22 A002 | A003 | D001 | 28 | 22 A001 | A002 | D001 | 35 | 28

结果解读:D001 这台设备被 A001/A002/A003 三个账户共用,三个账户两两成对,共产生 3 个关联对(C(3,2)=3)。这三个账户在 ODS 层还共享同一注册 IP

192.168.10.1
192.168.10.1
,注册时间集中在同一天,是典型的批量注册欺诈团伙特征。

在 Studio 中创建调度任务

Dynamic Table 的定期刷新通过 Studio Task 管理,不在 DDL 中写

REFRESH INTERVAL
REFRESH INTERVAL
。在 Studio 开发 → 任务 中,于
best_practices/fraud_graph/
best_practices/fraud_graph/
路径下创建两个"刷新动态表"任务:

  • 任务名:
    refresh_dwd_fraud_graph
    refresh_dwd_fraud_graph
  • 操作:
    REFRESH DYNAMIC TABLE best_practice_fraud_graph.dwd_shared_device_pairs
    REFRESH DYNAMIC TABLE best_practice_fraud_graph.dwd_shared_device_pairs
    REFRESH DYNAMIC TABLE best_practice_fraud_graph.dwd_txn_graph_edge
    REFRESH DYNAMIC TABLE best_practice_fraud_graph.dwd_txn_graph_edge
  • 调度:每 10 分钟触发一次
  • 在同一任务上可附加数据质量检查(例如当
    pair_count < 1
    pair_count < 1
    时触发告警)和监控规则

DWS 层 Dynamic Table:聚合统计与团伙特征

DWS 层对 DWD 层的两张边表做聚合,产出:每台设备关联的账户集群统计(是否多对账户共用)、每个账户的可疑交易统计(可疑率、金额、流向多样性)。

设备集群统计

CREATE DYNAMIC TABLE IF NOT EXISTS best_practice_fraud_graph.dws_device_cluster_stats AS SELECT shared_device_id AS device_id, COUNT(DISTINCT account_id_1) + COUNT(DISTINCT account_id_2) AS approx_account_count, SUM(login_count_1 + login_count_2) AS total_login_count, MIN(last_shared_time) AS earliest_shared, MAX(last_shared_time) AS latest_shared, COUNT(*) AS pair_count FROM best_practice_fraud_graph.dwd_shared_device_pairs GROUP BY shared_device_id;

账户交易风险统计

CREATE DYNAMIC TABLE IF NOT EXISTS best_practice_fraud_graph.dws_account_txn_risk AS SELECT src_account_id AS account_id, COUNT(*) AS total_txn_count, SUM(CASE WHEN is_suspicious = 1 THEN 1 ELSE 0 END) AS suspicious_count, ROUND(SUM(amount), 2) AS total_amount, ROUND(AVG(amount), 2) AS avg_amount, COUNT(DISTINCT dst_account_id) AS unique_dst_count, COUNT(DISTINCT channel) AS channel_diversity, ROUND( SUM(CASE WHEN is_suspicious = 1 THEN 1 ELSE 0 END) * 1.0 / COUNT(*), 4 ) AS suspicious_rate FROM best_practice_fraud_graph.dwd_txn_graph_edge GROUP BY src_account_id;

手动触发刷新:

REFRESH DYNAMIC TABLE best_practice_fraud_graph.dws_device_cluster_stats; REFRESH DYNAMIC TABLE best_practice_fraud_graph.dws_account_txn_risk;

查看设备集群统计:

SELECT device_id, approx_account_count, total_login_count, pair_count FROM best_practice_fraud_graph.dws_device_cluster_stats ORDER BY pair_count DESC;

device_id | approx_account_count | total_login_count | pair_count ----------+----------------------+-------------------+----------- D001 | 4 | 170 | 3 D005 | 2 | 38 | 1 D003 | 2 | 55 | 1 D002 | 2 | 33 | 1 D006 | 2 | 41 | 1 ...

结果解读:D001 设备的

pair_count=3
pair_count=3
,远高于其他设备(均为 1),且
total_login_count=170
total_login_count=170
也最高,是团伙核心设备。其他设备各有 2 个账户共用,构成若干两人欺诈对。

查看账户交易风险统计(TOP 5):

SELECT account_id, total_txn_count, suspicious_count, total_amount, suspicious_rate FROM best_practice_fraud_graph.dws_account_txn_risk ORDER BY suspicious_rate DESC, total_amount DESC LIMIT 5;

account_id | total_txn_count | suspicious_count | total_amount | suspicious_rate -----------+-----------------+------------------+--------------+---------------- A001 | 3 | 3 | 1230 | 1.0000 A009 | 2 | 2 | 850 | 1.0000 A015 | 1 | 1 | 800 | 1.0000 A016 | 1 | 1 | 790 | 1.0000 A006 | 1 | 1 | 700 | 1.0000

结果解读:A001 可疑交易率 100%,且发起 3 笔交易共计 1230 元,是该团伙中的核心转账节点;其多笔交易的目的账户分别是 A002、A003、A004,覆盖了同一 D001 设备集群中的其他成员。


ADS 层 Dynamic Table:高风险账户黑名单

ADS 层将 DWS 层的聚合特征与 ODS 层的账户注册信息合并,调用

calc_gang_risk_score
calc_gang_risk_score
UDF 打分,输出高风险账户黑名单。

CREATE DYNAMIC TABLE IF NOT EXISTS best_practice_fraud_graph.ads_high_risk_account_blacklist AS SELECT r.account_id, r.total_txn_count, r.suspicious_count, r.suspicious_rate, r.total_amount, COALESCE(dc.pair_count, 0) AS shared_device_pair_count, COALESCE(ip.risk_score, 0.0) AS register_ip_risk, an.is_verified, an.risk_label AS original_risk_label, ROUND( best_practice_fraud_graph.calc_gang_risk_score( r.suspicious_rate, CAST(COALESCE(dc.pair_count, 0) AS INT), COALESCE(ip.risk_score, 0.0), an.is_verified ), 2 ) AS gang_risk_score, CASE WHEN best_practice_fraud_graph.calc_gang_risk_score( r.suspicious_rate, CAST(COALESCE(dc.pair_count, 0) AS INT), COALESCE(ip.risk_score, 0.0), an.is_verified ) >= 80 THEN 'HIGH' WHEN best_practice_fraud_graph.calc_gang_risk_score( r.suspicious_rate, CAST(COALESCE(dc.pair_count, 0) AS INT), COALESCE(ip.risk_score, 0.0), an.is_verified ) >= 50 THEN 'MEDIUM' ELSE 'LOW' END AS risk_level, CURRENT_TIMESTAMP() AS score_time FROM best_practice_fraud_graph.dws_account_txn_risk r JOIN best_practice_fraud_graph.doc_account_node an ON r.account_id = an.account_id LEFT JOIN best_practice_fraud_graph.doc_account_device_edge ade ON r.account_id = ade.account_id LEFT JOIN ( SELECT account_id_1 AS account_id, COUNT(*) AS pair_count FROM best_practice_fraud_graph.dwd_shared_device_pairs GROUP BY account_id_1 UNION ALL SELECT account_id_2 AS account_id, COUNT(*) AS pair_count FROM best_practice_fraud_graph.dwd_shared_device_pairs GROUP BY account_id_2 ) dc ON r.account_id = dc.account_id LEFT JOIN best_practice_fraud_graph.doc_ip_node ip ON an.register_ip = ip.ip_addr;

手动触发刷新:

REFRESH DYNAMIC TABLE best_practice_fraud_graph.ads_high_risk_account_blacklist;

查看 HIGH 风险账户:

SELECT account_id, gang_risk_score, risk_level, suspicious_rate, shared_device_pair_count FROM best_practice_fraud_graph.ads_high_risk_account_blacklist WHERE risk_level = 'HIGH' GROUP BY account_id, gang_risk_score, risk_level, suspicious_rate, shared_device_pair_count ORDER BY gang_risk_score DESC;

account_id | gang_risk_score | risk_level | suspicious_rate | shared_device_pair_count -----------+-----------------+------------+-----------------+------------------------- A003 | 97 | HIGH | 1.0000 | 2 A001 | 87 | HIGH | 1.0000 | 2 A012 | 80.6 | HIGH | 1.0000 | 1

结果解读

  • A003(97 分):可疑率 100%、在共设备账户对中出现 2 次(与 A001、A002 各成一对)、注册 IP 风险 0.85、未实名认证,四项因子全线高危,评分最高。
  • A001(87 分):同为 D001 设备团伙成员,已实名认证(减 10 分),评分略低,但依然 HIGH。
  • A012(80.6 分):在 D006 设备上与 A011 共用,可疑率 100%、未实名,跨设备欺诈对成员。

查看风险等级分布:

SELECT risk_level, COUNT(DISTINCT account_id) AS account_count FROM best_practice_fraud_graph.ads_high_risk_account_blacklist GROUP BY risk_level ORDER BY account_count DESC;

risk_level | account_count -----------+-------------- MEDIUM | 14 HIGH | 3 LOW | 3

当前数据集中 3 个账户被标记为 HIGH(建议立即封号),14 个为 MEDIUM(加强验证或限额),3 个为 LOW(正常运营)。


ZettaPark Python Task:图算法扩展

对于 SQL 无法直接表达的图算法(连通分量、PageRank、社区发现),在 Studio 中创建 ZettaPark Python Task,通过 NetworkX 运行后将结果回写到 Lakehouse。

参考代码结构(在 Studio Python Task 中运行):

import networkx as nx from clickzetta_zettapark.session import Session session = Session.builder.config("profile", "skill_test").create() # 从 DWD 层读取共设备账户对 pairs = session.sql(""" SELECT account_id_1, account_id_2 FROM best_practice_fraud_graph.dwd_shared_device_pairs """).to_pandas() # 构建无向图,每个节点是账户,每条边是共设备关系 G = nx.from_pandas_edgelist(pairs, 'account_id_1', 'account_id_2') # 找出连通分量(即团伙分组) components = list(nx.connected_components(G)) gang_assignments = [] for gang_id, members in enumerate(components): for account in members: gang_assignments.append({ 'account_id': account, 'gang_id': f'GANG_{gang_id:04d}', 'gang_size': len(members) }) # 将结果写回 Lakehouse import pandas as pd df = pd.DataFrame(gang_assignments) session.write_pandas(df, 'ads_gang_component_map', schema='best_practice_fraud_graph', overwrite=True)


数仓对象总览

SHOW TABLES IN best_practice_fraud_graph;

schema_name | table_name | is_dynamic -----------------------------+----------------------------------+----------- best_practice_fraud_graph | doc_account_node | false best_practice_fraud_graph | doc_device_node | false best_practice_fraud_graph | doc_ip_node | false best_practice_fraud_graph | doc_transaction_edge | false best_practice_fraud_graph | doc_account_device_edge | false best_practice_fraud_graph | dwd_shared_device_pairs | true best_practice_fraud_graph | dwd_txn_graph_edge | true best_practice_fraud_graph | dws_device_cluster_stats | true best_practice_fraud_graph | dws_account_txn_risk | true best_practice_fraud_graph | ads_high_risk_account_blacklist | true

数据流向总结:

doc_account_device_edge (ODS) ↓ SELF JOIN(共设备账户对) dwd_shared_device_pairs (DWD, Dynamic Table) ↓ GROUP BY device_id dws_device_cluster_stats (DWS, Dynamic Table) ↓ ↘ ads_high_risk_account_blacklist (ADS, Dynamic Table) ↗ ← calc_gang_risk_score() SQL UDF dws_account_txn_risk (DWS, Dynamic Table) ↑ GROUP BY src_account_id dwd_txn_graph_edge (DWD, Dynamic Table) ↑ JOIN 账户节点风险标签 doc_transaction_edge + doc_account_node (ODS)


注意事项

  • Bloomfilter Index 对存量数据不自动生效

    CREATE BLOOMFILTER INDEX
    CREATE BLOOMFILTER INDEX
    只加速创建后写入的新数据。Bloomfilter 类型不支持
    BUILD INDEX
    BUILD INDEX
    ,如需对存量数据生效需重建表。Inverted Index 支持
    BUILD INDEX
    BUILD INDEX
    ,创建后可对存量数据重建。

  • Dynamic Table 增量刷新的语义:首次

    REFRESH
    REFRESH
    做全量快照计算;后续增量刷新只处理 ODS 层自上次刷新点以来新增或变更的行。如果 ODS 层使用
    INSERT OVERWRITE
    INSERT OVERWRITE
    写入,Dynamic Table 会退化为全量刷新,应改用
    APPEND
    APPEND
    模式写入或通过 Kafka PIPE 持续追加。

  • DDL 中不写 REFRESH INTERVAL:Dynamic Table 的定期刷新通过 Studio Task 管理。在 DDL 中写

    REFRESH INTERVAL
    REFRESH INTERVAL
    会导致无法在同一任务上追加监控告警和质检规则,建议统一用 Studio
    best_practices/fraud_graph/
    best_practices/fraud_graph/
    路径下的刷新任务调度。

  • ADS 层 CURRENT_TIMESTAMP() 评分时间戳

    score_time
    score_time
    字段使用
    CURRENT_TIMESTAMP()
    CURRENT_TIMESTAMP()
    ,每次刷新时会更新为当前时间,不是历史打分快照。若需要历史审计,应在回写时带上刷新任务的执行时间戳。

  • UDF 在 ADS 层被重复调用

    calc_gang_risk_score
    calc_gang_risk_score
    在 SELECT 和 CASE 中各出现一次,如需优化可先用子查询算一次分数再在外层做 CASE 判断。

  • ZettaPark NetworkX Task 的时序依赖:图算法 Task 应在 ADS Dynamic Table 刷新完成后运行,在 Studio 中配置任务依赖关系,避免读取脏数据。


相关文档

联系我们
预约咨询
微信咨询
电话咨询
邮件咨询