点击上方蓝色字体,选择“设为星标”

回复”资源“获取更多惊喜

大数据技术与架构点击右侧关注,大数据开发领域最强公众号!

大数据真好玩点击右侧关注,大数据真好玩!

目录

  • 一、概述

  • 二、数据模型

  • 三、数据格式

  • 四、架构图

  • 五、动态添加ClickHouse列

  • 六、用户关联(IdMapping)

  • 七、批量写入

  • 八、结束(附用户关联源码)

一、概述

埋点采集、用户行为分析、实时数仓、IdMapping

此文重点讲述埋点的数据模型、数据格式、数据实时采集、加工、存储及用户关联。关于用户行为分析的概念、意义以及埋点相关的东西此文不作赘述

二、数据模型

业界比较流行的事件、用户模型;即:

  • who: 设备ID、登录ID

  • when: 事件发生时间、上报时间

  • where: 设备环境、网络环境、业务环境等

  • what: 事件标识、事件参数

我们的数据存储也只有events和users两张表。

events:不会变的日志表且数据量大;我们用ClickHouse的分布式表存储 users:我们只有几百万用户,且做用户关联时会频繁根据用户id查询、更新,而且做数据分析时要和事件表关联;我们用ClickHouse的mysql Engine存储 events建表语句:

-- 事件local表;按日期周分区CREATE TABLE analytics.events_replica ON CLUSTER ck_cluster(  `track_id` String COMMENT '埋点',  `event_id` Int64 COMMENT '事件id',  `distinct_id` String COMMENT '设备id/用户中心id',  `user_id` Int64 COMMENT '用户表id',  `type` String COMMENT '埋点类型',  `event` String COMMENT '埋点事件',  `date` Date COMMENT '埋点日期',  `time` DateTime64 ( 3, 'Asia/Shanghai' ) COMMENT '埋点上传时间',  `receive_time` DateTime64 ( 3, 'Asia/Shanghai' ) COMMENT '埋点接受时间',  `day` Int64 COMMENT '埋点距1970/01/01的天数',  `week_id` Int64 COMMENT '埋点距1970/01/01的周数',  `month_id` Int64 COMMENT '埋点距1970/01/01的月数'  其他业务公共字段  所有事件属性  ) ENGINE = ReplicatedMergeTree ( '/clickhouse/tables/analytics/events_replica/{shard}', '{replica}' )PARTITION BY toMonday ( date ) ORDER BY  ( track_id ) SETTINGS index_granularity = 8192 -- 事件分布式表CREATE TABLE analytics.events ON CLUSTER ck_clusterAS analytics.events_replica ENGINE =Distributed('ck_cluster', 'analytics', 'events_replica', rand())

users建表语句:

-- ClickHouse Mysql Engine表CREATE TABLE cON CLUSTER ck_cluster(    `id` Int64 comment '系统用户id',    `first_id` String comment '第一次关联的设备id',    `second_id` String comment '用户中心id',    `$device_id_list` String comment '非第一次关联的设备id集合;逗号分隔')ENGINE = MySQL('host:port', 'database', 'table', 'user', 'password');     -- mysql表CREATE TABLE `users` (  `id` bigint(32) DEFAULT NULL,  `first_id` varchar(100) DEFAULT NULL,  `second_id` varchar(100) DEFAULT NULL,  `$device_id_list` varchar(500) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

三、数据格式

1.事件埋点

埋点时机: 行为事件记录 type = track 用户登录前: is_login_id=false, distinct_id=设备id 用户登录后: is_login_id=true, distinct_id=用户id 只能在properties里添加属

{  "distinct_id": "登录前(设备id)、登录后(用户id)",  "time": "当前时间戳",  "type": "track",  "event": "事件名",  "properties": {    "$is_login_id": true,     "$内置属性名": "内置属性值",    "$自定义属性名": "自定义属性值"  }}

例子:

{  "distinct_id": "123456",  "time": 1434556935000,  "type": "track",  "event": "ViewProduct",  "properties": {    "$is_login_id": true,    "$app_version": "1.3",    "$wifi": true,    "$ip": "180.79.35.65",    "$province": "湖南",    "$city": "长沙",    "$user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/58.0.3029.113 Mobile/14F89 Safari/602.1",    "$screen_width": 320,    "$screen_height": 568,    "product_id": 12345,    "product_name": "苹果",    "product_classify": "水果",    "product_price": 14.0  }}

2. 用户关联

埋点时机: 用户登录后 type=track_signup; event=$SignUp; distinct_id=用户ID; original_id=设备id

{    "distinct_id":"用户Id",    "original_id":"设备id",    "time": "当前时间戳",    "type": "track_signup",    "event": "$SignUp",    "properties": {        "$内置属性名":"内置属性值"    }}

例子:

{    "distinct_id":"12345",    "original_id":"2b0a6f51a3cd6775",    "time": 1434557935000,    "type": "track_signup",    "event": "$SignUp",    "properties": {        "$manufacturer":"Apple",        "$model": "iPhone5,2",        "$os":"iOS",        "$os_version":"7.0",        "$app_version":"1.3",        "$wifi":true,        "$ip":"180.79.35.65",        "$province":"湖南",        "$city":"长沙",        "$screen_width":320,        "$screen_height":568    }}

四、架构图

  • 前后端埋点:分为全埋点和自定义事件埋点;按数据条数和时间间隔批量发送

  • 埋点收集器:一个API接口,通过nginx作负载均衡,接收到埋点后异步写入kafka;业界通用的做法是用nginx接受埋点后直接落盘,然后再通过flume、logstash等日志采集工具采集到kafka。

  • kafka原始数据:通过flume采集一份到离线数仓

  • Flink ETL:核心数据处理逻辑

  • 1.动态添加ClickHouse列2.用户关联3.数据校验、解析、清洗
  • 批量写入:按数据条数和时间间隔批量写入ClickHouse

五、动态添加ClickHouse列

自定义埋点的事件属性会随着业务增加,事件属性会作为events表的列形成一张宽表,所以采集到事件后,会根据事件的属性实时动态添加events表的字段

events表的列会初始化一份到redis的set里,在Flink ETL里,和埋点属性的集合取差集,并更新redis

需要注意的时:添加列时需要同时添加events的local表和distributed表

六、用户关联(IdMapping)

参考神策数据的用户关联:

选取合适的用户标识对于提高用户行为分析的准确性有非常大的影响,尤其是漏斗、留存、Session 等用户相关的分析功能。因此,我们在进行任何数据接入之前,都应当先确定如何来标识用户。下面会介绍神策分析用户标识的原理,以及几种典型情况下的用户标识方案。

大概逻辑:

1.根据埋点事件、用户关联事件的设备ID或登录ID去用户表里找到对应的用户ID作为事件表的用户ID。

2.定时调度刷新设备多对一的情况。

流程图如下(源码见文末):

七、批量写入

由于jdbc的batchInsert需要sql一样,我们的实时采集事件却有所差别,导致sql不一样;这里我们可以根据sql分组,按一分钟或1000条批量写入即可。

八、结束

我们基于mysql实现了用户关联的逻辑;可以做到设备多对一,关联登录前后的用户。代码参考:https://github.com/ostarsier/idmapping

版权声明:

本文为《大数据真好玩》整理,原作者独家授权。未经原作者允许转载追究侵权责任。编辑|冷眼丶微信公众号|大数据真好玩

文章不错?点个【在看】吧! ?

家用电器用户行为分析与事件识别_用户行为分析埋点实时数仓实践相关推荐

  1. 家用电器用户行为分析与事件识别_用户行为分析系统

    随着互利网时代多元化商业模式和细分市场的快速发展,众多行业面临着高昂的获客成本和高流失率的双重挑战,如何精准定位获客渠道?如何精细化运管,挖掘更大的用户价值?如何洞察客户流失的真实原因?如何减少用户流 ...

  2. 埋点数据mysql分析_用户行为分析-埋点实时数仓实践(附用户关联源码)

    一.概述 埋点采集.用户行为分析.实时数仓.IdMapping 此文重点讲述埋点的数据模型.数据格式.数据实时采集.加工.存储及用户关联.关于用户行为分析的概念.意义以及埋点相关的东西此文不作赘述 二 ...

  3. 用户行为分析-埋点实时数仓实践(附用户关联源码)

    目录 一.概述 二.数据模型 三.数据格式 四.架构图 五.动态添加ClickHouse列 六.用户关联(IdMapping) 七.批量写入 八.结束(附用户关联源码) 一.概述 埋点采集.用户行为分 ...

  4. 数仓 调度_网易实时数仓实践

    分享嘉宾:马进 网易杭研 技术专家 编辑整理:张满意 出品平台:DataFunTalk 导读:随着大数据技术的进步,各种计算框架的涌现,数据仓库相关技术难题已经从离线数仓逐渐过渡到实时数仓,越来越多的 ...

  5. 【统一数据开发平台】-OLAP分析平台和实时数仓实践和优化

    一.业务背景 BIGO 是一家面向海外的以短视频直播业务为主的公司, 目前公司的主要业务包括 BigoLive (全球直播服务),Likee (短视频创作分享平台),IMO (免费通信工具) 三部分, ...

  6. 家用电器用户行为分析与事件识别_数据产品指北:用户行为分析平台

    本篇主要介绍了一些在用户行为分析平台中应用最广的产品功能和分析方法,包括:用户分群.留存分析.转化分析.行为路径分析和事件分析,与大家分享,供大家一同参考和学习. 相比于传统行业,用户行为分析平台可能 ...

  7. adb实时获取屏幕_实时数仓 | 你需要的是一款合适且强大的OLAP数据库(上)

    欢迎扫码关注我的公众号,回复[JAVAPDF]可以获得一份200页秋招面试题! 前言 今年有个现象,实时数仓建设突然就被大家所关注.我个人在公众号也写过和转载过几篇关于实时数据仓库的文章和方案. 但是 ...

  8. 数据分析与挖掘实战-家用电器用户行为分析与事件识别

    家用电器用户行为分析与事件识别 背景 居民使用家电过程中,会因为地区气候.区域不同.年龄差异,形成不同的使用习惯,若能深入了解这些习惯,针对性地开发新功能,便能开拓市场. 本案例以热水器为例,分析用户 ...

  9. 数据挖掘实战—家用热水器用户行为分析与事件识别

    文章目录 引言 一.数据探索分析 1.数据质量分析 1.1缺失值分析 1.2 异常值分析 1.3 重复数据分析 2.数据特征分析 2.1 分布分析 三.数据预处理 1.数据归约之属性归约 2.数据归约 ...

最新文章

  1. JQuery中的事件以及动画
  2. Did you forget add @script or @script_method annotation? If this is a nn.ModuleList, add it to __con
  3. python安装要钱吗-python语言是免费还是收费的?
  4. 悟懂MapReduce,不纠结!
  5. python列表各元素修改为int类型
  6. 读过的最好的epoll讲解
  7. 编程基础C——常量,变量,运算符个人总结
  8. MySQL DEBUG_SYNC 的简单分析与测试
  9. Python中的关键字和内置函数
  10. IOS文件操作(NSFileManager)
  11. 网络人“时间都去哪儿了”
  12. 电气防火限流式保护器应用场景及选型指南
  13. FTP下载文件夹到windows
  14. 比PS更简单好用的自动抠图软件 一键抠图工具
  15. jQuery.Deferred对象
  16. 360校园招聘2015届技术类笔试题
  17. Kubernetes Linux机器预置docker环境
  18. RGB 常用颜色对照表
  19. [日推荐] 『无忧育儿说』养育孩子就是这么简单!
  20. 使用bootdo框架添加登录验证码

热门文章

  1. logstash 自动重新加载配置
  2. 全链路跟踪系统设计与实践(转载)
  3. Lintcode107 Word Break solution 题解
  4. Centos6.5 安装配置docker
  5. Silverlight运行原理经典问答。
  6. Spark 案例(依据电商网站的真实需求)
  7. 2021个人北美秋招总结
  8. AutoCAD安装失败怎样卸载重新安装AutoCAD,解决AutoCAD安装失败的方法总结
  9. bootstrap简单登录界面
  10. Hbase 常见错误总结——摘自忘了