虚拟属性
简介
虚拟属性,是指在数据入库之后通过 SQL 表达式对已定义的属性进行二次加工,产生一个新的属性值。
虚拟属性作为GrowingIO推出的高级能力,涉及到较多技术细节,适用于SQL经验较强的用户参考。若对文档有疑问或使用上遇到问题,请及时联系GrowingIO的技术支持。
功能边界或约束
- 支持创建事件的虚拟属性,暂不支持创建用户和维度表的虚拟属性
- 支持引用事件属性独立创建或使用事件属性、用户属性共同创建事件虚拟属性
- 创建事件虚拟属性暂不支持引用维度表字段
- 支持创建字符串类型的虚拟属性
- 考虑到性能等因素的影响,虚拟属性开放了常规的函数供使用,支持的函数范围见附录
- 虚拟属性的SQL长度限制默认为2000字符,若需调整,可以到全局参数中配置(参数标识符为:virtual_variable_sqllimit)
功能说明
虚拟属性管理的入口:【数据中心】 - 【事件管理】 - 【虚拟属性】
创建虚拟属性
创建一个虚拟属性,分两个步骤。
步骤 一:设置虚拟属性基本信息
表单字段 | 含义及约束条件 |
---|---|
名称 | 虚拟属性的显示名,限长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 when | Case函数 | 假设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_query | URL参数提取 | 假设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的常用修饰符如下:
修饰符 | 描述 | 示例 |
---|---|---|
%Y | 年 | 2018 |
%y | 年份,最后两位数字(00-99) | 18 |
%m | 月份,零填充(01-12) | 01 |
%d | 月中的一天,零填充(01-31) | 02 |
%e | 月中的一天,无零填充(1-31) | 2 |
%H | 24小时格式(00-23) | 22 |
%I | 小时12h格式(01-12) | 10 |
%M | 分钟(00-59) | 33 |
%w | 周中第几天,周日为0(0-6) | 2 |