跳到主要内容
版本:4.1

虚拟属性

简介

虚拟属性,是指在数据入库之后通过 SQL 表达式对已定义的属性进行二次加工,产生一个新的属性值。

虚拟属性作为GrowingIO推出的高级能力,涉及到较多技术细节,适用于SQL经验较强的用户参考。若对文档有疑问或使用上遇到问题,请及时联系GrowingIO的技术支持。

功能边界或约束

  • 支持创建事件的虚拟属性,暂不支持创建用户和维度表的虚拟属性
  • 支持引用事件属性独立创建或使用事件属性、用户属性共同创建事件虚拟属性
  • 创建事件虚拟属性暂不支持引用维度表字段
  • 支持创建字符串类型的虚拟属性
  • 考虑到性能等因素的影响,虚拟属性开放了常规的函数供使用,支持的函数范围见附录
  • 虚拟属性的SQL长度限制默认为2000字符,若需调整,可以到全局参数中配置(参数标识符为:virtual_variable_sqllimit)

功能说明

虚拟属性管理的入口:【数据中心】 - 【事件管理】 - 【虚拟属性】

picture 1

创建虚拟属性

创建一个虚拟属性,分两个步骤。

步骤 一:设置虚拟属性基本信息

设置虚拟属性基本信息

表单字段含义及约束条件
名称虚拟属性的显示名,限长30个字符,且不能与事件属性重复。
标识符虚拟属性的标识符,限长100个字符,且不能与事件属性重复。
类型数据类型,可选值:字符串、整数、小数、日期。默认值:字符串。
全局属性绑定事件的方式,默认“否”。当选择“是”时,默认绑定到所有事件上。
精度当类型为小数时,支持设置精度位数,默认为4位
单位当类型为整数或小数时,支持设置单位
描述虚拟属性的描述,限长150个字符。
关联维度表将需要应用到分析工具的维度表关联到指定的虚拟属性上。

步骤 二:定义规则(虚拟属性的SQL表达式)

定义规则

SQL表达式细则:

  • 使用 'user.*'作为用户属性的前缀,如使用用户属性出生日期:user.$basic_birthday
  • 使用 'event.*'作为应用事件属性的前缀,无前缀默认为事件属性
  • 支持的函数范围及示例见附录

修改虚拟属性

对于已创建的虚拟属性,支持您再次编辑。

具体操作是点击某行虚拟属性,在详情页中点击“编辑”按钮,即可进入编辑弹窗。

修改虚拟属性

删除虚拟属性

对于已创建的虚拟属性,如果没有用或没有用到,您可以将其删除。

具体操作是点击某虚拟属性行的操作列,弹窗的删除按钮点击后即可删除该虚拟属性。

删除虚拟属性

提示:删除虚拟属性将影响到使用它的单图等应用。

虚拟属性绑定到事件上

对于已创建的虚拟属性,要想在分析工具中使用它,需将其绑定到需要分析的事件上。

绑定操作在【数据中心】 - 【事件管理】 - 【埋点事件】中。

绑定虚拟属性到事件

虚拟属性绑定到所有事件

当创建虚拟属性时,如果它引用的事件属性全部来源于预定义的事件属性,这时要把它绑定到所有事件上时,不必逐个事件一一绑定,只需要将该虚拟属性的“全局属性”类型设置为“是”即可。 虚拟属性全局绑定

应用案例

案例 1:属性数据类型转换

假设某埋点属性为订单价格(price_1,数值类型),希望精度保留到百位(向下取整)且转为字符串类型,以便于用它来做下钻分析。

SQL表达式: to_string(floor(price_1/100)*100) ​

案例 2:属性大小写转换

假设某埋点属性(name)上报值中有大小写混合的字符串,比如GrowingIO和growingio,在下钻分析时希望统计为一条growingio,这时可以创建一个新的虚拟属性来表达。

SQL表达式: lower(name) ​

案例 3:属性内容提取

假设我们埋点了一个事件属性url,希望从url中提取出参数arg的值用来做下钻分析,那么可以创建一个新的虚拟属性来表达。

​比如:url的值为 http://test.com/test?arg=渠道1

SQL表达式: parse_url_query(url,'arg')

返回值为:渠道1

案例 4:属性内容拼接

假设分析时,需要将多个字符串属性的值拼接在一起,合并成一个属性在分析图表中做下钻分析或筛选过滤,这时您可以创建一个新的虚拟属性来表达。

比如有属性A(var_1,字符串类型)、B(var_2,字符串类型)和(var_3,字符串类型),需要用分隔符“-”拼在一起

SQL表达式:concat(var_1 , '-' , var_2 , '-' , var_3)

案例 5:属性计算

假设订单事件在埋点时埋了两个属性:商品的进货价(price_1,数值类型)和出货价(price_2,数值类型),当我们想计算每个商品的进货价和出货价的差值,可以创建一个新的虚拟属性为利润(income)来表达。

SQL表达式:price_2 - price_1

案例 6:属性字典翻译

假设埋点时,某属性(var_1,字符串类型)上报时值为英文,属性值为可枚举。希望它在看板分析重展示时映射为中文,可以创建一个新的虚拟属性来表达。

属性值翻译值
level1初级
level2中级
level3高级

SQL表达式:

case when var_1 = 'level1' then '初级' when var_1 = 'level2' then '中级' when var_1 = 'level3' then '高级' else '其他等级' end

案例 7:日期相减 (事件属性、用户属性)

希望使用分析模型,根据按宝宝天龄/月龄做商品受众的年龄段分析。 触发事件时宝宝的天龄/月龄不能采集,需要计算得出。这时候可以创建一个虚拟属性,将事件触发时间和宝宝出生日期相减计算得出。

SQL表达式:date_diff('day',event.event_time, user.$basic_birthday) ​

常见问题

Q:虚拟属性可以在用户属性中创建吗?

A:目前不支持基于用户属性的虚拟属性创建,如果相关场景,您可以考虑通过新建用户属性+数据导入的方式获得所需属性值。 ​

Q:虚拟属性可以跨域引用属性吗?比如事件虚拟属性引用用户属性

A:V4.1版本已经支持 ​

Q:虚拟属性对查询性能的影响大吗?

A:虚拟属性由于不支持跨域引用属性,很大程度上规避了给统计图表带来性能降低的问题。大部分的虚拟属性对性能的影响几乎可以忽略,比如属性的计算、类型转换等;少量函数比如正则匹配,对使用它的单图的查询性能下降30%左右。

Q:虚拟属性引用的属性被删除,虚拟属性还能正常使用吗?

A:当引用的属性被删除时,虚拟属性立即变为异常状态。对于使用了异常的虚拟属性的单图将受到影响。

附录

虚拟属性支持的函数范围

函数含义示例
like模糊查询假设属性var_1值为GrowingIO,需要提取出包含Growing的值
SQL表达式:var_1 like '%Growing%'
regexp正则匹配假设属性var_1值为GrowingIO,需要提取出包含G开头的值
SQL表达式:regexp(var_1, '^G')
round四舍五入假设属性var_1为数值类型
SQL表达式:round(var_1)
floor向下取整假设属性var_1为数值类型
SQL表达式:floor(var_1)
ceill向上取整假设属性var_1为数值类型
SQL表达式:ceil(var_1)
if条件判断假设var_1为数值类型
SQL表达式:if(var_1>=100, 'VIP', '普通会员')
if_null判断空判断假设var_1为字符串类型,值域范围为:NULL, 男,希望NULL值转化为“女”
SQL表达式:if_null(var_1, '女')
coalesce非空查找查找多个属性中的非空首个值
SQL表达式: coalesce(var_1, var_2, var_3)
case whenCase函数假设var_1为数值类型
SQL表达式:
case
when var_1>=1000 then 'A级'
when var_1>=100 then 'B级'
when var_1>=10 then 'C级'
else '其他'
end
length字符串/列表长度假设var_1为字符串类型
SQL表达式:length(var_1)
concat字符串拼接假设var_1, var_2为字符串类型
SQL表达式:concat(var_1, var_2)
备注:支持两个及以上的字符串拼接
replace字符串替换假设var_1为字符串类型,值为GrowingIO,需要把IO替换为Hello
SQL表达式:replace(var_1, 'IO' , 'Hello')
substring字符串提取假设var_1为字符串类型,值为GrowingIO,需要提取前3个字符
SQL表达式:substring(var_1, 1, 3)
locate字符串位置假设var_1为字符串类型,值为GrowingIO,需要计算子串ing所在的位置
SQL表达式:locate(var_1, 'ing')
upper字符串转大写upper(var_1)
lower字符串转小写lower(var_1)
parse_url_queryURL参数提取假设var_1为URL链接的字符串,需要提取链接中参数为arg的值
SQL表达式:parse_url_query(var_1, 'arg')
to_string转字符串类型假设var_1为数值型
SQL表达式:to_string(var_1)
to_int转整型假设var_1为字符串类型的数值
SQL表达式:to_int(var_1)
to_float转小数假设var_1为字符串类型的数值
SQL表达式:to_float(var_1)
array_element数组取值假设var_1为列表(即数组)类型的数值
SQL表达式:array_element(var_1,1)为取该数组的第一个元素值
split字符串转为数组假设var_1为逗号分割的字符串
SQL表达式:split(',',var_1)
today今日日期SQL表达式:today()
now当前时间SQL表达式:now()
to_unix_timestamp时间格式转时间戳SQL表达式:to_unix_timestamp(now())
to_date字符串转日期假设var_1为字符串类型,如"2022-01-01"
SQL表达式:to_date(var_1)
to_datetime字符串转日期时间假设var_1为字符串类型,如"2022-01-01 00:00:00"
SQL表达式:to_datetime(var_1)
format_date日期格式化如将event_time转小时,
SQL表达式:format_date(event_time,'%H')
date_diff日期相减如根据用户出生日期与事件触发时间计算用户年龄
SQL表达式:date_diff('day',event.event_time, user.$basic_birthday)

format_date的常用修饰符如下:

修饰符描述示例
%Y2018
%y年份,最后两位数字(00-99)18
%m月份,零填充(01-12)01
%d月中的一天,零填充(01-31)02
%e月中的一天,无零填充(1-31)2
%H24小时格式(00-23)22
%I小时12h格式(01-12)10
%M分钟(00-59)33
%w周中第几天,周日为0(0-6)2