维度表和属性扩展

最后更新于:2018-08-02 14:12:45

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

自 1.11 版本开始,神策分析已经支持使用第三方的维度表来对已接入的事件和属性进行扩展,该功能可以大大的增强神策分析对于复杂业务需求的处理能力。

1. 典型应用

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

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

CREATE DATABASE dimensions;

CREATE TABLE dimensions.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

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

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

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

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

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

最后,我们还需要指定把该维度表(即 product_info)中的具体字段作为一个扩展属性加入神策系统中:

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

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

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

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

2. 进阶应用

2.1 复杂的维度关联

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

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

2.2 非维度属性的扩展

在进行维度扩展的时候,并不一定需要使用维度表,也可以直接基于已有的事件属性来进行。例如我们有一个事件属性是 $url,希望从 $url 中抽取出 q= 的属性,作为 search_keyword 来进行分析,那么我们可以这么做:

~/sa/web/bin/sa_view_tools.sh external_property add \
-p default \
-n search_keyword \
-e "parse_url(events.\$url, 'QUERY', 'q')" \
-t STRING

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

3. 限制与约束

3.1 查询性能

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

3.2 缓存一致性

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