oracle用户行为记录,用户行为分析-埋点实时数仓实践(附用户关联源码)

2023-10-29

一、概述

埋点采集、用户行为分析、实时数仓、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_cluster

AS 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

}

}

四、架构图

f2849ce3161a0a36e210739b7f0d8d98.png

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

埋点收集器:一个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表

f5badf2293e1feed205606999382993c.png

六、用户关联(IdMapping)

参考某策的用户关联:标识用户

c918e6968ddb5604594f29bc6cc98e89.png

大概逻辑:

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

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

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

a17ec2e161e9c0591334d33fb26898e5.png

七、批量写入

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

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

我基于mysql实现了用户关联的逻辑;可以做到设备多对一,关联登录前后的用户

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

oracle用户行为记录,用户行为分析-埋点实时数仓实践(附用户关联源码) 的相关文章

  • 六大软件开发模型详解

    软件测试工作与软件开发模型息息相关 在不同的软件开发模型中 测试的任务和作用也不相同 因此测试人员要充分了解软件开发模型 以便找准自己在其中的定位与任务 软件开发模型规定了软件开发应遵循的步骤 是软件开发的导航图 它能够清晰 直观地表达软件
  • 手把手教你实现AVL树、平衡二叉树

    今天 小编带大家一起来学习平衡二叉树 AVL树 吧 以下就简称AVL树了 想必能点开这篇博客的朋友都是极度深爱计算机的 那今天就让我们一起揭开AVL树的神秘面纱吧 目录 一 基本概念 二 实现原理 一 右旋转 二 左旋转 三 整体思路 四
  • Orcad17.4原理图导出PDF

    1 选取需要导出PDF的工程文件 2 修改页面顺序 更改的顺序即PDF输出页面顺序 此步骤需使用Shift或Ctrl选中 Ctrl A无法全选 左右拖动找到Schematic Page Number和Page Number 两项都需修改 点
  • Linux ssh升级后无法登陆

    无法3个不支持的选项 我们在 ssh config和sshd config中注视掉就好了 GSSAPIAuthentication GSSAPICleanupCredentials Unsupported option UsePAM 5 在
  • MyBatis新增数据时自增id的两种写法

    MyBatis新增数据时自增id的两种写法 一 单个插入 方式一 方式二 二 批量插入 三 注意 一 单个插入 接口方法 public interface PlayerDao int insertOnePlayer Player playe
  • Qt Quick 手册

    Qt Quick 简介 Qt Quick提供了一套高动态 丰富的QML元素来定制用户界面的说明性框架 Qt Quick有助于 程序开发员与界面设计员的合作为便携式设备建立流畅的用户界面 例如 移动电话 媒体播放器 机 顶盒以及上网本等 Qt
  • LeetCode45. 跳跃游戏 II

    45 跳跃游戏 II 给定一个非负整数数组 你最初位于数组的第一个位置 数组中的每个元素代表你在该位置可以跳跃的最大长度 你的目标是使用最少的跳跃次数到达数组的最后一个位置 假设你总是可以到达数组的最后一个位置 示例 1 输入 2 3 1
  • VS2019 + Qt5.12 配置完成后,无法打开 Qt 源文件解决方案(非常实用)

    注 本文主要是解决 VS 无法打开 Qt 源文件问题 关于 VS Qt 配置问题 网上一搜一大堆 各个版本都有 这里就不做详细阐述了 最近自己在使用 VS2019 建立 Qt 工程的时候 遇到了无法打开 Qt 源文件问题 在网上阅读了大量的
  • Free MyBatis plugin下载安装及作用

    idea中有很多可以利用的IDE集成插件 其中就包括持久层框架Mybatis相关的一些插件 这里具体介绍一下Free Mybatis plugin的安装及利用步骤 1 在idea中点击File gt Settings 然后搜索mybatis
  • java datetime now_Java ZonedDateTime now()用法及代码示例

    在ZonedDateTime类中 根据传递给它的参数 存在三种类型的now 方法 now ZonedDateTime类的now 方法用于从默认时区中的系统时钟获取当前日期时间 该方法将基于具有默认时区的系统时钟返回ZonedDateTime
  • Python的datetime包中的strptime和strftime的理解辨析

    strptime与strftime的辨别 strptime 即 str parse 解析 time 理解成 parse string into time format 解析字符串成datetime格式 strftime 即 str form
  • 【1day】复现LiveBOS ShowImage.do 接口存在任意文件读取漏洞

    注 该文章来自作者日常学习笔记 请勿利用文章内的相关技术从事非法测试 如因此产生的一切不良后果与作者无关 目录 一 漏洞描述 二 影响版本 三 资产测绘 四 漏洞复现 一 漏洞描述 LiveBOS 简称LiveBOS 是
  • JDBC连接mysql数据库

    jdbc连接mysql数据库代码 package com study jdbctest import java sql Connection import java sql DriverManager import java sql Res
  • 你尚未连接--代理服务器可能有问题,或地址不正确。

    这种情况可能是你装了梯子之后 自动开启了代理服务器 解决方法 1 控制面板 gt 网络和Internet 2 网络和共享中心 gt internet选项 3 连接 gt 局域网设置 4 把代理服务器的沟沟取消 这样就解决了
  • Django model select获取数据详细讲解

    基本操作 获取所有数据 对应SQL select from User User objects all 匹配 对应SQL select from User where name Pala User objects filter name P
  • 越伟大的事物越不带个人因素

    很多事物都带上个人因素 例如带有某些人的印记 但是越伟大的事物越不带个人因素 因为这时个人因素对于事物的发展已经不重要了 例如一位伟大的君主建立的王朝 会带上他的个人印记 例如他定的国号等 并且他的个人喜好 观点会影响民众 他的个人魅力和魄
  • JavaScript数据结构之队列

    JavaScript 数据结构之队列思维导图 JavaScript 数据结构之队列源码
  • Mock&Mockito使用手册

    基础概念 mock 测试就是在测试过程中 对于某些不容易构造或者不容易获取的对象 用一个虚拟的对象来创建以便测试的测试方法 这个虚拟的对象就是mock对象 mock对象就是真实对象在调试期间的代替品 Mock 对象 模拟对象的概念就是我们想
  • 关于从平台借用数据集的想法

    大家都知道 深度学习算法需要大量的数据 但是获取有标记的数据太难了 往往要花费大量的精力 一些比赛平台往往会发布任务相关的数据集 但是这些数据集是储存在云端不可获取的 如果我们能够借用这些与我们任务相关的数据的话 可以帮我们节约很长的时间

随机推荐

  • template elasticsearch6备注

    install sh脚本 ES TEMPLATE DIR home xlj elasticsearch 6 2 3 config template event json if test f ES TEMPLATE DIR then echo
  • ESP32 之 ESP-IDF 教学(十)—— 电机控制器(MCPWM)

    本文章 来自原创专栏 ESP32教学专栏 基于ESP IDF 讲解如何使用 ESP IDF 构建 ESP32 程序 发布文章并会持续为已发布文章添加新内容 每篇文章都经过了精打细磨 通过下方对话框进入专栏目录页 CSDN 请求进入目录 O
  • 【满分】【华为OD机试真题2023 JS】找出通过车辆最多颜色

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 找出通过车辆最多颜色 知识点滑窗 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 在一个狭小的路口 每秒只能通过一辆车 假如车辆的颜色只有3种 找出N秒内经过的最
  • OSG第三方库编译之三十八:hdf5编译(Windows、Linux、Macos环境下编译)

    目录 1 hdf5介绍 2 hdf5下载 3 Windows下编译 4 Linux下编译 5 MacOS下编译 1 hdf5介绍 HDF5 Hierarchical Data Format 是一种跨平台传输的文件格式 存储图像和数据 HDF
  • android wifi信号显示,如何获得可用的wifi网络并将其显示在android中的列表中

    朋友们 我想找到所有可用的WiFi网络并将其显示在我尝试过的列表中 如下所示 但它不起作用 我已经编辑了我的代码 现在我得到了结果但是得到了我不需要的所有结果 我只需要列表中的wifi网络名称 public class MainActivi
  • leetcode402——Remove K Digits

    题目大意 字符串num代表一个非负整数 删除其中k位使得数字变得最小 输出不能出现前导零和空串 分析 单调栈 贪心 贪心策略 从左往右删 如果左邻居 gt 当前位 就应该删掉左邻居 这样才能使数字变最小 栈 遍历字符串 当前位小于栈顶元素时
  • java线程异常_java线程异常处理方法

    工作中常发现有些程序发生异常但却没有错误日志 原因就是一些开发线程异常处理错误 导致程序报错但异常信息打印到堆栈上 不好在生产环境中定位问题 在java多线程程序中 所有线程都不允许抛出未捕获的checked exception 比如sle
  • bios无法识别usb键盘问题解决备忘

    戴尔的T3600工作站bios中无法使用usb键盘 参考 USB 3 0 和 USB 2 0 在 Precision T3600 T5600 或 T7600 系统上出现故障 Dell 中国https www dell com support
  • 禁止ubuntu系统弹出报错界面

    永远禁用掉Apport这一特性 可以远离在每次重启时出现错误提示的纷扰 编辑apport文件 etc default apport sudonano etc default apport 找到 enabled 1 这一行 并改变到0 zer
  • 什么是MES生产制造执行系统?实施系统有哪些好处?

    制造企业关心三个问题 生产什么 生产多少 如何生产 企业的生产计划回答了前两个问题 如何生产 由生产现场的过程控制系统SFC 掌握 ERP CRM等系统只为生产计划的编制提供数据信息 APS系统是提供详细的生产计划 为了使 计划 到达 生产
  • Java序列化对象的一个使用案例-使用Http发送对象

    Effective Java 中序列化一节关于java的序列化存在如下说法 对象序列化 object serialization API 它提供了一个框架 用来将对象编码成字节流 serializing 并从字节流编码中重新构建对象 des
  • 2023年Flutter淡出视野,是正在被悄悄放弃吗?

    前言 Flutter 完全没有被放弃的意思 相反Google还不断的更新 年年在进行优化迭代 就在十天前还更新到了3 7 什么是Flutter Flutter 是谷歌于 2017 年创建的用户界面工具包 它是一个开源框架 提供完整的小部件
  • unity代码创建mesh

    简介 Introduction 这个教程将让你学会如何创建一个星型控件以及如何制作这个控件的自定义编辑器 你将学会 动态的建立Mesh 使用一个嵌套类 建立一个自定义编辑器 使用SerializedObject 支持所见即所得 对Undo
  • 软件测试·同行评审

    在软件测试中 同行评审是用来检验软件开发 软件评测各阶段的工作是否齐全 规范 各阶段产品是否达到了规定的技术要求和质量要求 以决定是否可以转入下一阶段的工作 软件评审是为了确保软件开发项目的顺利进行而必须进行的工作 往往同行评审时由5人以上
  • restFUl做修改的时候

    restFUl做修改的时候 今天写修改突然想用restful风格 当我使用时 来到controller 并且跳转视图解析器 来到这个页面后 他的路径也就是update id script这时候就会把 识别成去掉 id 今天写修改突然想用re
  • ODOO12 自定义销售报价单样式

    1 以管理员登录系统 2 点击销售图标 进入销售管理系统 3 点击咱们开干呗图标 完善公司数据 4 设置公司数据后 点击应用按钮保存 5 点击定制按钮 自定义报价单模板 6 选择报价单模板 设置公司口号 和页脚后 点击应用按钮 7 点击确认
  • HTTP服务器项目详解

    HTTP 服务器项目 整体学习完HTTP 这个应用层协议之后 心血来潮 在老师和学长的帮助下 更多的是在百度的帮助下 算是顺利的完成了项目吧 功能 收到 TCP IP 协议栈发送过来的数据并对这些数据进行解析 得到有用的信息 然后对请求做出
  • python爬虫可以用来做什么?

    1 收集数据 python爬虫程序可用于收集数据 这也是最直接和最常用的方法 由于爬虫程序是一个程序 程序运行得非常快 不会因为重复的事情而感到疲倦 因此使用爬虫程序获取大量数据变得非常简单和快速 由于99 以上的网站是基于模板开发的 使用
  • 关于微信小程序上传,在微信公众平台

    2019 05 16 小程序小白入门 最开始的时候 我不知道该如何上传自己的代码 打开微信开发平台 找到 工具 选项 再点击 上传 就好了 找到 工具 选项 点击 上传 然后在微信公众微信公众平台 小程序中 我找不到上传的代码 线上版本 审
  • oracle用户行为记录,用户行为分析-埋点实时数仓实践(附用户关联源码)

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