概述
业务系统常常会产生大量的事件日志和数据,记录各种事件发生的相关信息,一条事件日志或者数据通常包含如事件ID,事件名称,时间点等。针对该类事件日志或者数据,DLA新提供了事件路径分析的聚合函数,主要支持按照事件时间点、时间戳得到事件顺序发生的时间序列,某类或者多类、某个或者多个事件发生的时间间隔序列等等。
数据模型
以下举例说明这类事件数据的数据模型,后面函数示例也以该示例数据为例。数据包含
user_id,event_time,event_id,event_name,event_attr,event_date等6个字段,本例中每个字段间用|分隔,该类数据或者日志可以存储在多种数据源中,比如对象存储、数据库、KV等(可以访问:https://zhuanlan.zhihu.com/data-lake-analytics , 查看更多DLA的云上数据能力、场景和使用方法介绍)。
4490015|1483266703322|10002|登陆|{}|2017-01-01
4490015|1483220795802|10005|收藏商品|{}|2017-01-01
4490022|1483233554546|10004|浏览商品|{"brand": "Apple", "price": 3500}|2017-01-01
4490022|1483279486394|10002|登陆|{}|2017-01-01
4490022|1483220124362|10002|登陆|{}|2017-01-01
4490022|1483233099062|10002|登陆|{}|2017-01-01
4490022|1483267998231|10010|退订商品|{}|2017-01-01
4490029|1483222204303|10007|生成订单|{"price_all": 4500}|2017-01-01
4490029|1483240004108|10004|浏览商品|{"brand": "LianX", "price": 7500}|2017-01-01
4490029|1483254745351|10006|加入购物车|{}|2017-01-01
本例,假设上面数据以sample.txt文本存储在阿里云对象存储OSS中,路径为:
oss://your_test_data_bucket/event_sample_data/sample.txt
则建schema、建表:
CREATE DATABASE `basic_test`
WITH DBPROPERTIES (
catalog = 'oss',
location = 'oss://your_test_data_bucket/'
)
COMMENT '';
CREATE EXTERNAL TABLE IF NOT EXISTS `basic_test`.`event_test` (
`user_id` bigint COMMENT '',
`event_time` bigint COMMENT '',
`event_id` int COMMENT '',
`event_name` varchar COMMENT '',
`event_attr` varchar COMMENT '',
`event_date` date COMMENT ''
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS `TEXTFILE`
LOCATION 'oss://your_test_data_bucket/event_sample_data/'
TBLPROPERTIES (
'auto.create.location' = 'true'
);
函数说明
1. event_sequence
说明:输出事件发生的时间点序列数组。
event_sequence(
boolean desc, -- 是否按照时间从大到小排列(可选,默认false,按照从小到大)
bigint limit, -- 输出的时间点序列数组的大小(可选,默认100,最大1000)
bigint timeInMS -- 事件发生的时间点、时间戳(必选,时间戳的long型,到毫秒)
)--> array[bigint]
例如:
SELECT event_name, event_sequence(event_time) AS a
FROM `basic_test`.`event_test`
GROUP BY 1
ORDER BY 1;
-->
+-----------------+--------------------------------------------------------------+
| event_name | a |
+-----------------+--------------------------------------------------------------+
| 加入购物车 | [1483254745351] |
| 收藏商品 | [1483220795802] |
| 浏览商品 | [1483233554546, 1483240004108] |
| 生成订单 | [1483222204303] |
| 登陆 | [1483220124362, 1483233099062, 1483266703322, 1483279486394] |
| 退订商品 | [1483267998231] |
+-----------------+--------------------------------------------------------------+
SELECT event_name, event_sequence(true, 3, event_time) AS a
FROM `basic_test`.`event_test`
GROUP BY 1
ORDER BY 1;
-->
+-----------------+-----------------------------------------------+
| event_name | a |
+-----------------+-----------------------------------------------+
| 加入购物车 | [1483254745351] |
| 收藏商品 | [1483220795802] |
| 浏览商品 | [1483240004108, 1483233554546] |
| 生成订单 | [1483222204303] |
| 登陆 | [1483279486394, 1483266703322, 1483233099062] |
| 退订商品 | [1483267998231] |
+-----------------+-----------------------------------------------+
2. event_interval
说明:输出事件发生的时间点间隔序列数组。如果事件只发生一次,则无间隔值,对应数组输出空。
event_interval(
boolean desc, -- 是否按照时间从大到小排列(可选,默认false,按照从小到大)
bigint limit, -- 输出的时间点间隔序列数组的大小(可选,默认100,最大1000)
bigint timeInMS, -- 事件发生的时间点、时间戳(必选,时间戳的long型,到毫秒)
varchar timeZoneKey, -- 指定的时区名称(可选,默认为系统(DLA服务所在region)当前时区)
varchar timeUnit -- 要显示的时间点间隔的时间度量单位(*)
)--> array[bigint]
* 其中,时间度量单位目前支持:
YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND, MILLISECOND
例如:
SELECT event_name,
event_interval(event_time, 'second') as a
FROM `basic_test`.`event_test`
GROUP BY 1
ORDER BY 1;
-->
+-----------------+-----------------------+
| event_name | a |
+-----------------+-----------------------+
| 加入购物车 | [] |
| 收藏商品 | [] |
| 浏览商品 | [6449] |
| 生成订单 | [] |
| 登陆 | [12974, 33604, 12783] |
| 退订商品 | [] |
+-----------------+-----------------------+
SELECT event_name,
event_interval(true, 3, event_time, current_timezone(), 'millisecond') as a
FROM `basic_test`.`event_test`
GROUP BY 1
ORDER BY 1;
-->
+-----------------+-----------------------------------+
| event_name | a |
+-----------------+-----------------------------------+
| 加入购物车 | [] |
| 收藏商品 | [] |
| 浏览商品 | [-6449562] |
| 生成订单 | [] |
| 登陆 | [-12783072, -33604260, -12974700] |
| 退订商品 | [] |
+-----------------+-----------------------------------+
SELECT event_name,
event_interval(event_time, 'UTC', 'day') as a
FROM `basic_test`.`event_test`
GROUP BY 1
ORDER BY 1;
-->
+-----------------+-----------+
| event_name | a |
+-----------------+-----------+
| 加入购物车 | [] |
| 收藏商品 | [] |
| 浏览商品 | [0] |
| 生成订单 | [] |
| 登陆 | [0, 0, 0] |
| 退订商品 | [] |
+-----------------+-----------+
Data Lake Analytics首购和流量包优惠
首购用户1元10TB,流量包阶梯折扣优惠:https://et.aliyun.com/bdad/datalake
产品详情:https://www.aliyun.com/product/datalakeanalytics
云栖社区:https://yq.aliyun.com/teams/396
知乎社区:https://zhuanlan.zhihu.com/data-lake-analytics