菜单

维度表

概述

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

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

目前你可在「元数据」-「维度表」中查看你已经在后台自定义的维度表和 items 表中已有的属性信息。如需使用 items 表的属性创建虚拟属性,那么需要先在后台建立 items 和 events 表的关联。

使用 items 表作为维度表

如果希望启用 items 表,首先需要通过 SDK 提供的 itemSet 接口进行 Item 信息的上报。以 Java SDK 为例:

Map properties = new LinkedHashMap<>();
properties.put("product_name", "iPhone 8");
properties.put("product_manufacturer", "Apple");
properties.put("price", 998.88);
// 参数分别为 item_type、item_id、自定义属性
sensorsAnalytics.itemSet("product", "T12345", properties);

注意:item_type 可以用于区分不同的 item 类型,比如 movie、muisic 等,item_id 区分同一个 item 类型下面的不同的 Item。

然后,我们就可以在自定义查询功能中使用这个表:

SELECT * FROM items LIMIT 10

接下来我们建立 items 和 events 表的关联:

scaadmin external_view external_dimension_table add \
-p default \
-t items \
-e "events.product_id = items.item_id AND items.item_type = 'product'"

注意:这里是使用 product_id 字段进行关联,同时限定了 item_type。如果同时存在多种 item_type,那么需要建立多次不同的关联,具体请参考 4 中的例子。

最后,使用 items 表中的 product_manufacturer 来创建虚拟属性即可:

scaadmin external_view external_property add \
-p default \
-n product_manufacturer \
-c '产品制造商' \
-e items.product_manufacturer \
-t STRING

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

如果需要对维度表和虚拟属性进行删除、更新等管理操作,可以直接执行不带参数的命令查看相关的帮助:

scaadmin external_view external_property 

自定义维度表

除了引用 items 表之外,我们也可以手动创建维度表。

1.创建新的维度表,可执行命令

scaadmin dimension_table create -p {项目英文名} -t {维度表名} -k {维度表主键} -c {维度表字段及类型}
//sp 1.18+,sca  0.3.2+,低于该版本请切换左上方版本号到 2.2 以下版本

可使用如下命令查看版本号

spadmin upgrader version


本命令执行后可在维度表数据库中创建一张新的维度表。书写格式参考:

参数参数详情
-p 项目英文名

-p defalut

其中,default 为项目英文名。无法确定需要创建维度表的项目名时,参考下图,神策访问地址里 project ={项目英文名}

-t 

维度表名

表名称请自定义,仅支持英文字母、下划线、数字,且建议以英文开头,总长度不超过 100 字符

-t product_info
-k

维度表主键

如果是多主键,写多个字段用英文逗号分隔。

-k  product_id


-c

维度表字段及字段类型

注意加引号,格式为字段名 字段类型,字段之间用英文逗号分隔

-c 'product_id STRING, product_manufacturer STRING '

支持的数据类型有: BIGINT, BOOLEAN, INT,DECIMAL, REAL, FLOAT, INTEGER,  SMALLINT, STRING, TINYINT, VARCHAR,TIMESTAMP

执行实例参考:

scaadmin dimension_table create \
-p default \
-t product_info \
-k product_id \
-c "product_id STRING, product_manufacturer STRING"

执行完成后,即创建一张维度表(kudu 表),可根据返回获得维度表名称,例如 :dimension_table_default.product_info。

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

如需删除维度表,请务必先删除使用该维度表的属性创建的虚拟属性

查看关联维度表的虚拟属性:

scaadmin external_view external_property list -p <项目名>  

删除维度表

scaadmin  dimension_table drop -t  <表名>   -p  <项目名> 
例如:scaadmin  dimension_table drop -t product_info  -p default
// 默认如果存在表关联关系则不支持删除,如果需要强行删除,可加 --skip_check 参数,加上 --skip_check 参数之后,即使表存在关联关系,也仍然强制执行删除。
// 注意!删除有一定的危害!删除后将无法继续使用该维度表创建虚拟属性!!请确认后再删除!

如需列出维度表,请使用:

scaadmin  dimension_table list -p <项目名> 


2.创建成功后的维度表,例如 dimension_table_default.product_info( dimension_table_default 是数据库名,product_table 为表名),可使用如下方法进行查看和添加数据

使用 imapla-shell

impala-shell

查看创建的维度表

use dimension_table_default;
show tables;

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

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

如果需要插入的数据量比较大,建议使用批量文件导入的方式。首先需要创建一个文本格式的表,并指定分隔符,例如:

CREATE TABLE dimensions.raw_csv_product_info (
	product_id STRING,
	product_manufacturer STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED by ',' LOCATION '/tmp/raw_csv_product_info/';

然后上传已经准备好的逗号分隔的文本数据文件:

hdfs dfs -put data.csv /tmp/raw_csv_product_info/

刷新 CSV 表,并执行 INSERT 把数据导入 Kudu 即可。

REFRESH dimensions.raw_csv_product_info;
INSERT INTO dimension_table_default.product_info SELECT * FROM dimensions.raw_csv_product_info;

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

scaadmin external_view external_dimension_table add \
-p default \
-t dimension_table_default.product_info \
-e 'events.product_id = dimension_table_default.product_info.product_id'

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

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

scaadmin external_view external_property add \
-p default \
-n product_manufacturer \
-c '产品制造商' \
-e dimension_table_default.product_info.product_manufacturer \
-t STRING

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

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

如果同一张维度表需要使用不同的关联条件,那么需要在新增维度表的时候使用别名。具体的方式为在原有的表面后面加上 #1 、#2、#a、#b等,注意别名分隔请使用 # 号。例如:

scaadmin external_view external_dimension_table add \
-p default \
-t dimension_table_default.product_info#1 \
-e 'events.item_id = dimension_table_default.product_info#1.item_id'

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

限制与约束

查询性能

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

缓存一致性

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

测试维度表的关联条件

对于比较复杂的关联条件,建议先使用 impala-shell 执行 SQL 来进行测试,以保证结果的正确性。可以直接使用 JOIN 语法进行,例如:

/*sa(test_project)*/ 
SELECT dimension_table_default.product_info.product_manufacturer FROM
events 
LEFT JOIN dimension_table_default.product_info
ON events.product_id = dimension_table_default.product_info.product_id
WHERE date = CURRENT_DATE()
LIMIT 100

FAQ

关联属性支持哪几种数据类型?

使用 events 表中的属性与维度表进行关联时,支持选择 String 或 Number 类型的普通属性。

上一个
用户属性
下一个
虚拟属性
最近修改: 2024-12-27