我是标题
  • 介绍
  • 产品使用指南
    • 新手入门
      • 神策分析是什么
      • 神策分析能做什么
      • 神策分析怎么解决问题
      • 神策分析的数据来源
    • 功能介绍
      • 基本概念
        • 行为分析常用名词
        • 神策分析相关名词
        • 基础指标配置说明
        • 属性筛选条件说明
      • 分析模块
        • 事件分析
        • Session 分析
        • 漏斗分析
        • 留存分析
        • 分布分析
        • 归因分析
        • 用户路径分析
        • 网页热力分析
        • APP 点击分析
        • 间隔分析
        • 用户属性分析
        • 搜索用户
        • 用户分群
          • 用户分群(1.14 版本)
          • 用户分群
          • 用户分群(1.13 之前版本)
        • 用户行为序列
        • 书签及数据概览
          • 数据概览(1.11 之前版本)
          • 概览分组
          • 渠道对比组件使用说明
          • 预置概览
        • 自定义查询
      • 辅助功能
        • 事件分类
        • 查询抽样
        • 权限管理
          • 角色权限与账号(1.14 版本)
        • 预警管理
        • 元数据管理
        • 可视化全埋点
        • 维度字典
        • 正则表达式
        • 推荐分享
        • 小版本升级
        • 掌上神策分析
  • 技术指南
    • 数据采集
      • 数据模型
      • 数据格式
      • 调试模式
        • 调试模式动态配置
      • 数据校验
      • 导入实时查看
        • 导入实时查看(新版本)
        • 导入实时查看(老版本)
      • 埋点管理
      • 多项目
      • 如何准确的标识用户
      • 新增用户及首日首次标记
    • 快速接入指南
      • 接入前准备(全员阅读)
      • 如何准确的标识用户 (全员阅读)
      • 事件设计 (需求方阅读)
      • SDK 采集数据 (开发必读)
        • JavaScript 快速使用
        • 微信小程序快速使用
        • Android 快速使用
        • iOS 快速使用
        • Java 快速使用
      • 数据校验(测试必读)
    • 客户端 SDK
      • C++ SDK
      • 微信小程序 SDK
        • 微信小程序 SDK 历史版
        • 微信小程序 SDK 标准版
        • 微信小程序 SDK 插件版
        • 微信小程序 SDK 自定义全埋点版
      • 支付宝小程序 SDK
      • 百度小程序 SDK
      • JavaScript SDK
        • 常见问题
        • 全埋点(AutoTrack)
        • 点击图(HeatMap)
        • 单页面
        • 关闭页面发数据
      • Android SDK
        • 常见问题
        • 全埋点(AutoTrack)
        • 点击图(HeatMap)
      • iOS SDK
        • 常见问题
        • 全埋点(AutoTrack)
        • 点击图(HeatMap)
      • 打通 App 与 H5
      • App 第三方框架
        • React Native(Android & iOS)
        • Flutter(Android & iOS)
        • Weex(iOS)
        • Weex(Android)
        • 第三方 H5 页面嵌入 js(iOS)
        • 第三方 H5 页面嵌入 js(Android)
      • APICloud SDK
    • 服务端 SDK
      • C SDK
        • C SDK Demo
      • CSharp SDK
      • Java SDK
        • Java SDK Demo
      • Python SDK
      • PHP SDK
      • Ruby SDK
      • Golang SDK
      • Node SDK
    • 公共属性
    • 渠道追踪
      • App 渠道追踪
      • Web 渠道追踪
      • 小程序渠道追踪
      • 渠道对接
      • 渠道链接管理
    • 数据导入
      • BatchImporter
      • LogAgent
        • LogAgent 场景使用示例
      • FormatImporter
      • HdfsImporter
      • 数据导入常见问题
    • 数据导出
      • 查询 API
      • 订阅实时数据
      • 使用 JDBC 进行数据访问
      • 数据迁移
    • 辅助工具
      • 数据清理工具使用说明
      • 多项目管理工具使用说明
      • 元数据创建工具使用说明
      • 环境检测工具使用说明
    • 高级功能
      • 数据接入 API
      • App 消息推送
      • 虚拟属性和维度表
      • 数据预处理模块
      • 服务转发配置
      • 使用 HTTPS 的数据接入
      • API
        • 查询 API
        • 功能 API
          • 分群 API(1.12 及之前版本)
          • 分群 API(1.13 版本)
          • 分群 API(1.14 版本)
          • 埋点统计 API(1.11 及之前版本)
          • 埋点统计 API(1.12 及之后版本)
      • 第三方登录
      • 数据归档
  • 最佳实践
    • 功能应用示例
      • 事件分析
      • 漏斗分析
      • 留存分析
      • 分布分析
      • 间隔分析
      • 用户分群
      • 自定义查询
      • 用户行为序列
    • 复杂分析场景
      • 定位商品销量变化原因
  • 常见问题
  • 产品更新日志
Powered by GitBook
On this page
  • 1. 虚拟属性
  • 1.1 应用场景 1:属性抽取
  • 1.2 应用场景 2:属性合并
  • 1.3 应用场景 3:高精度小数
  • 1.4 应用场景 4:联合去重
  • 1.5 应用场景 5:时间聚合
  • 1.6 更多应用
  • 2. 维度表
  • 2.1 定义维度表
  • 2.2 基于维度表创建虚拟属性
  • 2.3 复杂的维度关联
  • 2.4 一张维度表使用不同的关联条件
  • 3. 限制与约束
  • 3.1 查询性能
  • 3.2 缓存一致性

Was this helpful?

  1. 技术指南
  2. 高级功能

虚拟属性和维度表

本文档所描述的内容属于神策分析的高级使用功能,涉及较多技术细节,适用于对相关功能有经验的用户参考。如果对文档内容有疑惑,请咨询您的数据咨询顾问获取一对一的协助。

自 1.11 版本开始,神策分析已经支持虚拟属性功能,同时还支持使用第三方的维度表来对已接入的事件和属性进行进一步的扩展,该功能可以大大的增强神策分析对于复杂业务需求的处理能力。 创建虚拟属性和维度表均需要在部署神策系统的服务器上操作。

请先 ssh 到部署了神策服务的任意一台机器,在 sa_cluster 账户下执行场景虚拟属性或者维度表的命令。

1. 虚拟属性

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

1.1 应用场景 1:属性抽取

创建虚拟属性需要用到 sa_view_tools 这个工具。例如我们现在有一个事件属性是 $url,希望从 $url 中抽取出 q= 的属性,作为 search_keyword 来进行分析,那么我们可以这么做:

~/sa/web/bin/sa_view_tools.sh external_property add \
-p default \
-n search_keyword \
-c '搜索关键词' \
-e "parse_url(events.\$url, 'QUERY', 'q')" \
-t STRING
spadmin external_view external_property add \
-p default \
-n search_keyword \
-c '搜索关键词' \
-e "parse_url(events.\$url, 'QUERY', 'q')" \
-t STRING

其中,-n 是外部属性在神策系统中的英文名称,-c 是中文名称,-e 是对应的 SQL 表达式,-t 表示数据类型。

我们在 -e 参数中使用了一个 parse_url 的 SQL 函数来进行参数提取,这样在分析的时候使用 search_keyword 属性即可实现相关的分析需求。

1.2 应用场景 2:属性合并

假设我们在埋点的时候埋了两个属性:item_id 和 item_id_1,但实际上它们是一个含义,希望在使用的时候进行合并,也可以使用虚拟属性功能来定义:

~/sa/web/bin/sa_view_tools.sh external_property add \
-p default \
-n new_item_id \
-c 'Item Id' \
-e "coalesce(events.item_id, events.item_id_1)" \
-t STRING
spadmin external_view external_property add \
-p default \
-n new_item_id \
-c 'Item Id' \
-e "coalesce(events.item_id, events.item_id_1)" \
-t STRING

这里的 coalesce 是一个标准 SQL 函数,返回所有参数中第一个非 NULL 的值,这样我们在使用的时候只要使用 new_item_id 来进行分析就可以达到属性合并的目的。

1.3 应用场景 3:高精度小数

默认情况下,神策分析的 NUMBER 类型只支持小数点之后 3 位,如果需要支持高精度类型,可以使用扩展属性的方式来实现。具体做法如下:

  • 将需要支持高精度的内容以字符串的类型来发送给神策分析,以避免精度丢失,以 Java SDK 为例:

Map<String, Object> properties = new HashMap<String, Object>();
properties.put("big_number", "123.12312345");
sa.track(distinctId, true, "TestBigNumber", properties);
  • 创建一个高精度类型的虚拟属性

# 这里假设传入的原始字符串属性为 big_number,创建的高精度属性为 big_number_decimal
# decimal 参数中的 38 表示总的数据位数,16 表示小数点之后的位数
~/sa/web/bin/sa_view_tools.sh external_property add   \
-p default \
-n big_number_decimal \
-c '高精度数字' \
-e 'cast(events.big_number as decimal(38,16))' \
-t number
# 这里假设传入的原始字符串属性为 big_number,创建的高精度属性为 big_number_decimal
# decimal 参数中的 38 表示总的数据位数,16 表示小数点之后的位数
spadmin external_view external_property add   \
-p default \
-n big_number_decimal \
-c '高精度数字' \
-e 'cast(events.big_number as decimal(38,16))' \
-t number
  • 使用 big_number_decimal 属性进行相关的分析

1.4 应用场景 4:联合去重

在神策分析中,我们支持对某个属性进行去重数的计算,但是不直接支持对两个或者更多的属性进行去重。如果有这类需求,也可以使用虚拟属性的方式来实现,即定义一个新的属性,它的值是需要去重的多个属性的组合。

例如,我们想计算不同用户浏览不同商品的去重次数(即一个用户浏览同一个商品不重复计数,但是浏览不同的商品需要计数),那么可以定义一个虚拟属性如下:

~/sa/web/bin/sa_view_tools.sh external_property add \
-p default \
-n user_and_product \
-c '用户ID + 商品ID' \
-e "concat(cast(events.user_id as string), events.product_id)" \
-t STRING
spadmin external_view external_property add \
-p default \
-n user_and_product \
-c '用户ID + 商品ID' \
-e "concat(cast(events.user_id as string), events.product_id)" \
-t STRING

然后在神策分析中,查看这个属性的去重数即可得到对应的指标。

1.5 应用场景 5:时间聚合

默认情况下,神策分析支持天、周、月等时间聚合方式,如果想要其它的时间聚合方式,也可以使用虚拟属性实现。例如,如果想要按照 "周X" 来对数据进行分析,可以从 time 属性中提取出一个 day_of_week 的属性:

~/sa/web/bin/sa_view_tools.sh external_property add \
-p default \
-n day_of_week \
-e 'dayofweek(time)' \
-t NUMBER
spadmin external_view external_property add \
-p default \
-n day_of_week \
-e 'dayofweek(time)' \
-t NUMBER

类似的,也可以用 extract(hour from time) 表达式来提取时间中的小时部分。

1.6 更多应用

由于 external_property add 命令的 -e 参数支持任意的 Impala SQL 表达式,因此,可以很灵活的根据实际的业务需求来创建虚拟属性。

2. 维度表

除了基于已经埋点的属性来直接创建虚拟属性之外,我们还可以结合第三方维度表来创建更复杂的虚拟属性应用。

2.1 定义维度表

假设我们在神策分析中有一个 pay_order 事件,同时该事件有 product_id、product_name 等属性。现在我们希望在分析的时候使用 product 的更多其它维度来进行分析(例如 product_manufacturer),但是这些维度并没有在埋点的时候打入神策系统中,这个时候就可以引入维度表来满足这个需求。

首先,我们需要准备好使用的维度表,在这个例子中,我们使用一张 product_info 的维度表来作为例子。首先我们需要在 impala 中创建这样一张表:

注意,这里的维度表必须使用 Kudu 或者 HDFS 的 Parquet 文件格式来存储,否则无法支持全部特性。

CREATE DATABASE items;

CREATE TABLE items.product_info (
  product_id STRING NOT NULL,
  product_manufacturer STRING NULL,
  PRIMARY KEY (product_id)
)
PARTITION BY HASH (product_id) PARTITIONS 3
STORED AS KUDU TBLPROPERTIES ('kudu.master_addresses'='${kudu_master_host}:7051');

可以通过此命令获取 kudu master 的地址。

monitor_tools get_config -t client -m kudu
spadmin config get client -m kudu

然后,我们需要准备好这张维度表的数据,通常应该是从其它业务数据库或者数据仓库中导入进来。具体可以使用 impala-shell 导入 SQL 文件,或者 JDBC 等多种方式来进行,例如我们先直接插入几条数据:

INSERT INTO items.product_info VALUES ('124', 'Xiaomi'), ('123', 'Apple');

在准备好维度表数据之后,我们用 sa_view_tools 工具来把该维度表加入神策系统中:

~/sa/web/bin/sa_view_tools.sh external_dimension_table add \
-p default \
-t items.product_info \
-e 'events.product_id = items.product_info.product_id'
spadmin external_view external_dimension_table add \
-p default \
-t items.product_info \
-e 'events.product_id = items.product_info.product_id'

其中,-p 是神策系统的项目名称,-t 参数是维度表的完整名称, -e 参数表示该维度表和事件表(events)的关联关系,即 SQL 中进行 JOIN 的条件。

2.2 基于维度表创建虚拟属性

在定义了维度表之后,我们就可以把该维度表(即 product_info)中的具体字段作为一个虚拟属性加入神策系统中:

~/sa/web/bin/sa_view_tools.sh external_property add \
-p default \
-n product_manufacturer \
-c '产品制造商' \
-e items.product_info.product_manufacturer \
-t STRING
spadmin external_view external_property add \
-p default \
-n product_manufacturer \
-c '产品制造商' \
-e items.product_info.product_manufacturer \
-t STRING

至此,我们已经可以在神策系统的所有分析功能中使用 pay_order 进行分析的时候,看到 product_manufacturer 属性,并使用这个属性进行任意的分析工作。

如果需要对维度表和虚拟属性进行删除、更新等管理操作,可以直接执行 ~/sa/web/bin/sa_view_tools.sh 命令查看相关的帮助。

2.3 复杂的维度关联

如果 product_info 表并不能使用 product_id 进行唯一标识,例如同一个 product 可能会多个不同的 product_version,那么可以使用更复杂的维度关联条件来解决这个问题:

~/sa/web/bin/sa_view_tools.sh external_dimension_table add \
-p default \
-t items.product_info \
-e 'events.product_id = items.product_info.product_id AND events.product_version = items.product_info.product_version'
spadmin external_view external_dimension_table add \
-p default \
-t items.product_info \
-e 'events.product_id = items.product_info.product_id AND events.product_version = items.product_info.product_version'

2.4 一张维度表使用不同的关联条件

如果同一张维度表需要使用不同的关联条件,那么需要在新增维度表的时候使用别名。具体的方式为在原有的表面后面加上 #1 或者其它标识符。例如:

添加完成之后,后面在其它命令引用这张表时也需要使用 items.product_info#1。

3. 限制与约束

3.1 查询性能

由于关联维度表需要使用 JOIN,虽然神策的查询引擎已经对这个类型的 JOIN 做了一定程度的优化,但是相比直接使用原始的事件属性依然会有比较显著的性能降低,具体的性能和维度表的大小、JOIN 的条件等都有关系。因此,我们建议在直接使用事件属性可以满足需求的情况下,不要使用维度表;同时,应当保证维度表的行数在百万以内,以尽量降低 JOIN 带来的额外性能损耗。

3.2 缓存一致性

目前为止,神策系统的缓存机制依然是基于事件数据的变更来实现的,这个机制中暂时没有考虑到维度表的数据变化带来的影响。因此,如果维度表的数据发生了变更(例如进行 Update 或者 Insert),查询结果可能还会使用旧的缓存数据,这个时候需要强制刷新才能得到正确的结果。

PreviousApp 消息推送Next数据预处理模块

Last updated 6 years ago

Was this helpful?