1. 概述

所谓虚拟属性,是指在数据入库之后通过 SQL 表达式对已有的事件属性和用户属性进行二次加工,产生一个新的属性值。

虚拟属性根据表达式中引用到的属性类型分为用户虚拟属性和事件虚拟属性,需要注意的是确定了虚拟属性的类型之后只能引用同类型的属性,即事件虚拟属性不能引用用户属性,用户虚拟属性不能引用事件属性,所以虚拟属性类型的选择应该根据所引用的属性的类型来决定。

本文档所描述的内容属于神策分析的高级使用功能,涉及较多技术细节,适用于对相关功能有经验的用户参考。如果对文档内容有疑惑,请统一咨询客户群内的神策值班同学。

如何使用维度表 > 

2. 创建虚拟属性

进入「元数据」-「虚拟属性」后点击「新建」按钮。选择此虚拟属性的分类并完成相关基本信息的填写后。在「SQL 表达式」中填写的 expression 实际上只需要填写对属性的加工的 sql 表达式片段即可快速完成一个虚拟属性的创建,而不需要一个完整的 sql 表达式。

虚拟属性分为两种类型,事件虚拟属性和用户虚拟属性,顾名思义。分别含义请见如下说明:

信息

说明

属性分类

事件虚拟属性:指使用现有的 Event 事件表内的属性进行加工,也可使用 Event 与 Items 表或维度表(在后端通过命令完成关联配置后)后基于此创建新的事件虚拟属性。

用户虚拟属性:指使用现有的 User 用户表中的属性进行二次加工,已完成新的属性与属性值的创建。

属性显示名

属性在使用过程中的显示名称,100 字符以内。

属性名

仅可命名为英文,是事件在系统内的唯一标示。

不能以数值、$ 符号开头,100 字符以内。
注:校验时,属性名大小写不敏感。

数据类型

必填单选:NUMBER、BOOL、STRING、DATETIME

字典

如果此属性使用了字典,编辑时修改虚拟属性的 SQL 规则,则需要对该虚拟属性重新上传维度字典。,需要在虚拟属性列表上重新上传所需的字典文件。

SQL 表达式

必填,只需要填写对属性的加工的 sql 表达式片段即可,示例可见下文

可用此属性的事件要求



此设置只在选择了属性分类是「事件虚拟属性」后需要设置。(如果是「用户虚拟属性」那么在分析时将所有的事件均可使用此属性进行分析。)

涵盖 SQL 表达式涉及的所有属性的事件,方可使用此虚拟属性。

涵盖至少一个 SQL 表达式中涉及的属性的事件,方可使用此虚拟属性。

3. 以下我们提供了集中常见的使用场景:

3.1. 数学函数

当需要对已有的数值型属性进行数学函数操作的二次加工时, 我们选用数学函数. 

  • 加减乘除运算:例如,我们有两个事件属性商品标价。commodity_price, 成交的最终价格 final_price当我们想判断商品标价与最终价格的差值时我们可以直接

    SQL 表达式:events.commodity_price - events.final_price

  • 高精度小数: 默认情况下,神策分析的 NUMBER 类型只支持小数点之后 3 位,如果需要支持高精度类型,可将属性已字符串类型上报给神策,再创建 NUMBER 类型的高精度小数虚拟属性

    SQL 表达式:cast(events.big_number as decimal(38,16))

       

  • 幂次函数: 例如,查询理财产品的本息总和。

    SQL 表达式:events.capital + events.capital * pow(events.rate_of_interest, events.duration)

3.2. 时间日期函数

在用到时间日期函数前需要注意的是, 只有 Timestamp 类型可以直接使用 impala 的时间日期函数, 所以如果当 Date/Datetime 类型的属性作为时间日期函数的参数时, 我们需要先使用 EPOCH_TO_TIMESTAMP 函数将属性转换为 Timestamp 类型.

  • adddate: 在一个 TIMESTAMP 值上加一个给定的天数

    SQL 表达式:adddate(EPOCH_TO_TIMESTAMP(users.birthday), INT/BIGINT days)

  • datediff : 返回两个时间戳间隔天数

    SQL 表达式:datediff(EPOCH_TO_TIMESTAMP(events.enddata), EPOCH_TO_TIMESTAMP(events.startdate))

  • extract: 从TIMESTAMP值中截取数值型的时间域,例如年度,月份,日期,小时,分钟,秒/微秒(year,month,day,hour,minute,second,millisecond), 返回时间域的整数值.

    SQL 表达式:extract(Year/Month/Day/Hour from EPOCH_TO_TIMESTAMP(users.birthdays))

  • dayofweek: 返回当前时间戳是周几(当然了也有 dayofmonth, dayofyear...)

    SQL 表达式:dayofweek(EPOCH_TO_TIMESTAMP(events.register_time))

3.3. 字符串函数

  • concat: 联合去重, 把所有string类型的参数连接成一个string类型.

    SQL 表达式:concat(events.$province, events.&city)

  • regexp_like(string source, string pattern[, string options]) : 判断source字符串中是否包含以pattern为正则表达式的内容

    SQL 表达式:regexp_like(users.user_name, '[a-zA-Z0-9._ //-//[//](){}]{1,15}')

  • parse_url: 属性抽取, 通过指定URL中的特定部分返回截取值. 可指定要截取的值为'PROTOCOL', 'HOST', 'PATH', 'REF', 'AUTHORITY', 'FILE', ‘USERINFO', ‘QUERY'. 正常我们只需要输入指定的 url 以及需要截取的部分两个参数, 特殊的当要截取的部分为 ‘QUERY' 时, 我们可以输入第三个参数指定 QUERY 键值对中的 key,获取指定参数值.

    SQL 表达式:parse_url(events.$url, 'QUERY', 'q')

3.4. 条件函数

  • caolesce: 属性合并, 这个函数会返回参数中第一个有值的参数的值. 假设我们在埋点的时候埋了两个属性:item_id 和 item_id_1,但实际上它们是一个含义,希望在使用的时候进行合并,也可以使用虚拟属性功能来定义。
  • SQL 表达式:coalesce(events.item_id, events.iten_id_1)

4. 校验规则与常见错误

  1. 表达式中引用的属性必须存在且已经上报数据

  2. 涉及到两个属性的数值计算时必须保证两个属性数据类型相同

  3. 虚拟事件属性不能引用用户属性

  4. 虚拟用户属性不能引用事件属性

  5. number类型的虚拟属性运算符号两边必须是数字运算数字

  6. 有维度字典的虚拟属性表达式返回值也必须为 bigint, string

  7. 数据类型与返回值必须保持一致
  8. 若创建虚拟属性后,又上报了相同名字的属性, 虚拟属性会失效.