文档

如何通过图算法能力获取OneID高质量人

更新时间:

本文将重点讲解如何将传统的用户登录信息进行离线处理,构建用户与设备间的多种复杂图关系,并基于图关系完成离线图算法分析,快速和精准的挖掘出多设备多账号对应的自然人信息。

(一)背景

对于几乎所有的互联网企业,对于识别、追踪用户身份都有强烈的需求,精准识别用户身份后,就可以收集用户个性化的行为、身份数据,比如用户浏览了什么商品,看了什么视频,去了哪个餐厅等等,从而可以对搜索,广告,推荐等等场景做出精准、个性化的展现。

首先需要确定核心数据:用户ID和设备ID、用户与设备关系数据。业务方根据当前埋点数据进行抽取和盘点;在梳理的过程中可能遇到的数据问题:数据不完整、弱关系,没有直接关系的数据,是否通过多种数据关系进行关联和挖掘。对数据源进行细致梳理过程,可将数据源的表名、数据描述、抽取原则、数据量级、ID选取等,大部分的业务都会采用一张数据库表来表达:涉及到多种设备id、内部账号信息等,多种维度的用户可定位的重点信息。

下面将针对具体Case进行方案讲解,例如表配置【table_orgin】:

trusted_id

app_id

oa_id

imei

...

可信设备id

登录注册id

广告标识符

手机设备

...

主要特点:

1)该表无唯一主键,每个id都可能交叉出现、重复设备信息存储。

2)信息存储简单,查询复杂

(二)传统数据库表如何进行关系梳理

为了能将设备id进行可靠信息聚合,我们需要将【table_orgin】简单的大宽表进行梳理,完成基于图结构的设备关系表。

(1)多维数据打平

新建一张数据表将【table_orgin】变为【table_create_device_id】,将需要用到的核心设备信息进行主键生成,让多维的设备类型统一归为device_id,同时生成设备对应的主键id,本次我们选取4个核心设备信息【trusted_id\app_id\oa_id\imei】进行构图。

INSERT overwrite table table_create_device_id PARTITION (ds='2023-11-11')
select device_id 
from
(
select DISTINCT(trusted_id) as device_id from table_orgin
where dt = '2023-11-11' and trusted_id is not null
UNION 
select DISTINCT(imei) as device_id from table_orgin
where dt = '2023-11-11' and imei is not null
UNION 
select DISTINCT(oa_id) as device_id from table_orgin
where dt = '2023-11-11' and oa_id is not null
UNION
select DISTINCT(app_id) as device_id from table_orgin
where dt = '2023-11-11' and app_id is not null
);

(2)设备id分配临时id,创建新表【device_temp_id】

INSERT overwrite table device_temp_id PARTITION (ds='2023-11-11')
select ROW_NUMBER() OVER(PARTITION BY ds ORDER BY table_create_device_id) AS id, device_id from device_ids
where ds = '2023-11-11';

(3)新建【table_orgin_device_id】

将【table_orgin】中各种id转换成设备表的主键字段,将trusted_id对应的【device_temp_id】的id主键。

trusted_id

app_id

oa_id

imei

trusted_id_key

app_id_key

oa_id_key

imei_key

可信设备id

登录注册id

广告标识符

手机设备

INSERT overwrite table table_orgin_device_id PARTITION (ds='2023-01-02')
select trusted_id_key, oa_id_key, imei_key, app_id_key
from
(
select trusted_id, oa_id, imei, app_id from 
table_orgin
where dt = '2023-11-11'
) A
left outer join
(
select id as imei_int, device_id from
device_temp_id
where ds = '2023-11-11'
) B
on A.imei = B.device_id
left outer join
(
select id as oa_id_int, device_id from
device_temp_id
where ds = '2023-11-11'
) C
on A.oa_id = C.device_id
left outer join
(
select id as trusted_id_int, device_id from
device_temp_id
where ds = '2023-11-11'
) D
on A.trusted_id = D.device_id
left outer join
(
select id as app_id_int, device_id from
device_temp_id
where ds = '2023-11-11'
) F
on A.app_id = F.device_id;

(4)数据清洗

该层重点工作在于数据抽取、清洗和融合等ETL处理,虽然比较基础,但该层构建是否精准,将决定了项目的成败;

1)ID清洗:ID清洗务必保证以下两个细节点需要特别注意,以免造成重大影响:

【准确性】在ID清洗过程时,需要反复测试,保证清洗工作的质量,不正确的ID清洗会影响ID收容完整性和ID标识的准确性,对下游影响非常大;

【一致性】把ID清洗封装成UDF函数,保证ID清洗的一致性,并且可以利用工厂模式实现,提高易用性与减少函数维护成本;例如:imei和idfa清洗时,使用同一个函数,传参不同而已udf_id_is_valid(imei, 'IMEI')和udf_id_is_valid(idfa, 'IDFA');

2)ID修复:多种专家经验和策略协助,做一步ID修复处理,这样可以变废为宝,减少脏数据的比率例如:去除imei字符串尾部多余;

(5)建立点边关系

将4个核心设备信息进行一对一关系建立,成为一个一维关系表:

image.png

(三)基于图算法进行设备信息聚合挖掘

在这种设备信息挖掘的场景,通常使用图算法-社区发现 Weakly Connected Components:弱连通分量(WCC)算法在有向图和无向图中寻找连通节点集。如果两个节点之间存在路径,则表示两个节点已连接。相互连接的所有节点的集合形成一个组件。与强连接组件(SCC)相反,不考虑两个节点之间路径上的关系方向。例如,在有向图(a)→(b)中,即使没有向关系(b)→(a), a和b也会在同一个分量中。本算法计算每个点的连通分量成员,最后输出顶点值中包含最小顶点ID的连通分量。将最小顶点ID沿着边传播到连通分量的所有顶点。

准备工作

在进行全图分析之前,我们需要新建图计算实例和创建图配置,并完成图数据的批量导入或者API数据写入。

1)创建图计算服务实例,点击链接进行实例开通,早起测试阶段可选用【独享分析型】规格进行功能验证。

2)创建图配置,可参考最佳实践基于GraphCompute快速搭建好友推荐图应用进行业务数据和配置接入。

图算法配置

1)功能操作:

在图计算服务需要进行边集选择,选中图中已关闭【索引优化】的边表可进行算法分析;无需额外配置权重字段。

image.png

2)任务运行:

点击图算法配置的"运行"按钮,弹窗提示计费之后点击确认即可运行,任务运行记录可以点击配置的“历史任务“进行查看;当前产品功能属于公测期间,暂不额外收费。

3)结果产出:

点击“保存配置”成功创建图算法配置之后,会在图中自动创建出一个新的点,点的名称为填写的表格最下方的导出结果,后续运行图算法任务成功之后,任务结果会自动回流到该结果点,回流完成之后即可在线查询

(四)在线查询结果

图计算为了方便用户能够将离线图算法的分析结果查询,形成了一套业界领先的一体化流程,只需要开通图计算服务实例,即可同时拥有高性能图数据的查询分析一体化引擎。相比业界方案,图计算服务方案更便捷,无需额外自运维数据链路,让数据流转更高效。

image.png

该算法结果点为倒排类型,componentId字段表示联通子图ID:

使用倒排查询的语法查询指定componentId下面的所有点:g("user_***_graph").V().hasLabel("填写结果配置的表名").indexQuery("{\"match\":{\"component_id\":\"2001\"}}")