menu
Is this helpful?

# 创建虚拟属性最佳实践

虚拟属性是指通过 SQL 表达式针对已入库的属性字段进行二次计算创建的属性。虚拟属性的SQL表达式使用trino语法,可以访问 Trino 文档 (opens new window) 获取trino的语法以及函数的使用方法。

应用场景一:时间差计算

在埋点时,一般不会将用户生命周期天数作为事件属性采集,那么可以通过在事件属性中添加用户注册时间,然后通过如下方式获取用户产生事件时的生命周期情况。可使用date_diff(unit, timestamp1, timestamp2)函数计算用户属性“注册时间”和事件属性“事件发生时间”的间隔天数,生成虚拟用户属性“用户生命周期天数”,如:dat_diff('day', date("register_time"), date("#event_time"))

应用场景二:类型转换

使用过程中,会出现上报属性类型与预期不符的情况。可通过cast(value AS type)函数进行属性类型转换,需注意,若属性值无法强制转换成预期类型,则新属性值为空。规则如:cast(old_prop_string as int)

应用场景三:时间戳转换

当注册时间等自定义属性上传为一个数值类型的时间戳时,可通过from_unixtime(unixtime)函数将其转换为时间格式,以便在系统中进行筛选和分组等操作。规则如from_unixtime("register_time")

应用场景四:截取字符

在某些情况下,一个属性上报的内容可能是多个信息的组合,例如"获得奖励"属性的值被传为了一个字符串"获得钻石300",这时如果希望截取这个属性中的固定位置字符为新的属性时,可以通过如下表达式实现cast(substring("get_reward", 5, 4) as int),函数substring(string, start, length)用于截取字符中,自start开始的长度为length的片段,并通过cast(value AS type)函数将截取片段转换为数值类型,用于后续分析。

应用场景五:联合去重

在游戏的数据分析场景中,往往会记录账号id及服务器id等公共事件属性,但目前系统仅提供针对单一属性的去重计算,如果要以账号id和服务器id进行联合去重,就可以创建规则如下的虚拟属性concat(server_id, '@',account_id),其中函数concat(string1, ..., stringN)可用于拼接多个文本型属性。

应用场景六:条件判断

在游戏测试阶段会存在清档的情况,虽然清档前后用户的ID不变但是清档前后的事件数据都是独立的,并没有继承关系,并且不同区服的清档时间可能会不同,此时希望通过一个属性来区分单个用户的事件是清档前还是清档后的,则可以通过创建如下虚拟属性实现:

case 
when "serverid" = 1 and "#event_time" > cast('2020-11-15 10:30:00.000' as timestamp) then '清档后' 
when "serverid" = 2 and "#event_time" > cast('2020-11-22 10:30:00.000' as timestamp) then '清档后' 
else '清档前' 
end

应用场景七:常数

利用IF函数可以创建一个为常数的虚拟属性,例如留存模型中希望能够同时展示回访人数的阶段累计总和,即可创建一个常数1的虚拟属性,进而对这个属性进行聚合计算,规则如下

if("#event_time" is not null, 1, 1),此处"#event_time"一般设置为非空的系统字段即可。