Flink实时数仓之用户埋点系统(二)

news2024/11/16 20:40:35

用户埋点平台-数仓建模

1、数据仓库

1.1 数据仓库的构建

1.1.1 数据模型

数据模型就是数据组织和存储方法,它强调从业务、数据存取和使用角度合理存储数据。只有将数据有序的组织和存储起来之后,数据才能得到高性能、低成本、高效率、高质量的使用。

  • 高性能:良好的数据模型能够帮助我们快速查询所需要的数据。
  • 低成本:良好的数据模型能减少重复计算,实现计算结果的复用,降低计算成本。
  • 高效率:良好的数据模型能极大的改善用户使用数据的体验,提高使用数据的效率。
  • 高质量:良好的数据模型能改善数据统计口径的混乱,减少计算错误的可能性。

1.1.2 数仓建模理论

1.1.2.1 维度模型

维度模型将复杂的业务通过事实和维度两个概念进行呈现。事实通常对应业务过程,而维度通常对应业务过程发生时所处的环境。

:业务过程可以概括为一个个不可拆分的行为事件,例如交易中的下单,取消订单,付款,退单等,都是业务过程。

下图为一个典型的维度模型,其中位于中心的 SalesOrder 为事实表,其中保存的是下单这个业务过程的所有记录。位于周围每张表都是维度表,包括 Date(日期),Customer(顾客),Product(产品),Location(地区)等,这些维度表就组成了每个订单发生时所处的环境,即何人、何时、在何地下单了何种产品。从图中可以看出,模型相对清晰、简洁。
维度建模-数据分层

维度建模以数据分析作为出发点,为数据分析服务,因此它关注的重点的用户如何更快的完成需求分析以及如何实现较好的大规模复杂查询的响应性能。

1.1.2.2 维度建模理论之事实表

事实表作为数据仓库维度建模的核心,紧紧围绕着业务过程来设计。其包含与该业务过程有关的维度引用(维度表外键)以及该业务过程的度量(通常是可累加的数字类型字段)。

事实表特点

事实表通常比较“细长”,即列较少,但行较多,且行的增速快。

事实表分类

事实表有三种类型:分别是事务事实表周期快照事实表累积快照事实表,每种事实表都具有不同的特点和适用场景,下面逐个介绍。

事务事实表

事务事实表用来记录各业务过程,它保存的是各业务过程的原子操作事件,即最细粒度的操作事件

设计事务事实表时一般可遵循四个步骤:选择业务过程 → 声明粒度 → 确认维度 → 确认事实

周期快照事实表

周期快照事实表以具有规律性的、可预见的时间间隔来记录事实,主要用于分析一些存量型(例如商品库存,账户余额)或者状态型(空气温度,行驶速度)指标,它们的值往往是连续的

累积快照事实表

累计快照事实表是基于一个业务流程中的多个关键业务过程联合处理而构建的事实表,如交易流程中的下单、支付、发货、确认收货业务过程

1.1.2.3 维度建模理论之维度表

维度表包含了事实表中指定属性的相关详细信息

维度表的实时更新策略:

在实时数仓中,我们不对业务数据库中的维度表进行合并,仅对一些不需要的字段进行过滤,然后将维度数据写入 HBase 的维度表中,业务数据库的维度表和 HBase 的维度表是一一对应的。

写入维度数据使用 HBase 的 Phoenix 客户端提供的 upsert 语法,实现幂等写入。当维度数据发生变化时,程序会用变化后的新数据覆盖 Phoenix 维表中相同主键的旧数据。从而保证 Phoenix 表中保存的是一份全量最新的维度数据。

通过 Flink CDC 检测维度表的实时变化

2. 数据仓库设计

2.1 数据设计

2.1.1 数据仓库设计流程

在这里插入图片描述

2.1.2 数据域划分

数据仓库模型设计除横向的分层外,通常也需要根据业务情况进行纵向划分数据域。

划分数据域的意义是便于数据的管理和应用

通常可以根据业务过程或者部门进行划分,本项目根据业务过程进行划分,需要注意的是一个业务过程只能属于一个数据域。

2.1.3 构建业务总线矩阵

业务总线矩阵中包含维度模型所需的所有事实(业务过程)以及维度,以及各业务过程与各维度的关系。矩阵的行是一个个业务过程,矩阵的列是一个个的维度,行列的交点表示业务过程与维度的关系。

2.1.3.1 明确统计指标

1)指标体系相关概念

(1)原子指标

原子指标基于某一业务过程度量值,是业务定义中不可再拆解的指标,原子指标的核心功能就是对指标的聚合逻辑进行了定义。我们可以得出结论,原子指标包含三要素,分别是业务过程、度量值和聚合逻辑。

例如订单总额就是一个典型的原子指标,其中的业务过程为用户下单、度量值为订单金额,聚合逻辑为 sum()求和。

(2)派生指标

派生指标基于原子指标,其与原子指标的关系如下图所示。
在这里插入图片描述

(3)衍生指标

衍生指标是在一个或多个派生指标的基础上,通过各种逻辑运算复合而成的。例如比率、比例等类型的指标。衍生指标也会对应实际的统计需求。

2.1.3.2 指标分类
主题子主题衍生指标/派生指标派生指标/被依赖的派生指标统计周期统计粒度原子指标业务限定
业务过程度量值聚合逻辑
流量主题各渠道流量统计当日各渠道独立访客数(UV)各窗口各版本各渠道各类别独立访客数窗口渠道操作系统版本页面浏览device_id
当日各渠道页面访问量 (PV)各窗口各版本各渠道各类别页面访问量窗口渠道操作系统版本页面浏览page_url
新老访客流量统计各类页面访问数各窗口各版本各渠道各类页面独立访问数窗口渠道操作系统版本页面浏览
各类页面点击/关闭数各窗口各版本各渠道各类页面点击/关闭数窗口渠道操作系统版本页面点击
各类访客平均使用时长各窗口各版本各渠道各类别应用停留时长窗口渠道操作系统版本online_time
各窗口各版本各渠道各类别独立访客数窗口渠道操作系统版本
当日启动次数各窗口各版本各渠道独立用户启动次数窗口渠道操作系统版本
当日人均启动次数各窗口各版本各渠道独立用户启动次数窗口渠道操作系统版本
各窗口各版本各渠道独立访客数窗口渠道操作系统版本
用户主题用户新增活跃统计当日新增用户数(DNU)各窗口各版本各渠道注册用户数窗口渠道操作系统版本用户注册is_new
当日活跃用户数(DAU)各窗口各版本各渠道启动独立用户数窗口渠道操作系统版本用户启动device_id
当日用户留存率各窗口各版本各渠道注册用户数窗口渠道操作系统版本用户注册
各窗口各版本各渠道活跃用户数窗口渠道操作系统版本用户浏览点击
当日启动次数各窗口各版本各渠道独立用户启动次数窗口渠道操作系统版本用户启动
当日人均启动次数各窗口各版本各渠道独立用户启动次数窗口渠道操作系统版本用户启动
各窗口各版本各渠道独立访客数窗口渠道操作系统版本页面浏览
交易主题用户交易统计当日订单支付总额各窗口各渠道各支付方式订单支付总额窗口渠道操作系统交易方式商品用户支付成功
当日订单退款总额各窗口各渠道各支付方式订单退款总额窗口渠道操作系统交易方式商品用户退款成功
当日订单数量各窗口各渠道各支付方式订单数量窗口渠道操作系统交易方式商品用户创建订单

3 数据仓库分层

3.1 ODS 层

采集到 Kafka 的 topic_log 和 topic_db 主题的数据即为实时数仓的 ODS 层,这一层的作用是对数据做原样展示和备份

3.2 DIM 层

DIM 层设计要点:

(1)DIM 层的设计依据是维度建模理论,该层存储维度模型的维度表。

(2)DIM 层的数据存储在 HBase 表中

DIM 层表是用于维度关联的,要通过主键去获取相关维度信息,这种场景下 K-V 类型数据库的效率较高。常见的 K-V 类型数据库有 Redis、HBase,而 Redis 的数据常驻内存,会给内存造成较大压力,因而选用 HBase 存储维度数据。

(3)DIM 层表名的命名规范为 dim_表名

3.2.1 配置表

本层的任务是将业务数据直接写入到不同的 HBase 表中,需要让程序知道流中的哪些数据是维度数据,维度数据又应该写到 HBase 的哪些表

create database note_config;
CREATE TABLE `table_process` (
  `source_table` varchar(200) NOT NULL COMMENT '来源表',
  `sink_table` varchar(200) DEFAULT NULL COMMENT '输出表',
  `sink_columns` varchar(2000) DEFAULT NULL COMMENT '输出字段',
  `sink_pk` varchar(200) DEFAULT NULL COMMENT '主键字段',
  `sink_extend` varchar(200) DEFAULT NULL COMMENT '建表扩展',
  PRIMARY KEY (`source_table`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `table_process`(`source_table`, `sink_table`, `sink_columns`, `sink_pk`, `sink_extend`) VALUES ('t_pay_order', 'dim_t_pay_order', 'uid,order_no,pay_order_id,way_code,amount,state,product_id,product_name,user_id,create_time,success_time', 'uid', NULL);
INSERT INTO `table_process`(`source_table`, `sink_table`, `sink_columns`, `sink_pk`, `sink_extend`) VALUES ('t_refund_order', 'dim_t_refund_order', 'uid,refund_order_no,pay_order_id,way_code,pay_amount,refund_amount,state,product_id,product_name,user_id,create_time,success_time', 'uid', NULL);

3.2 主要任务

3.2.1 接收 Kafka 数据,过滤空值数据

对 Maxwell 抓取的数据进行 ETL,有用的部分保留,没用的过滤掉。

3.2.2 动态拆分维度表功能

由于 Maxwell 是把全部数据统一写入一个 Topic 中, 这样显然不利于日后的数据处理。所以需要把各个维度表拆开处理。

在实时计算中一般把维度数据写入存储容器,一般是方便通过主键查询的数据库比如 HBase,Redis,MySQL 等。

这样的配置不适合写在配置文件中,因为这样的话,业务端随着需求变化每增加一张维度表表,就要修改配置重启计算程序。所以这里需要一种动态配置方案,把这种配置长期保存起来,一旦配置有变化,实时计算可以自动感知。这种可以有三个方案实现:

一种是用 Zookeeper 存储,通过 Watch 感知数据变化;

另一种是用 mysql 数据库存储,周期性的同步;

再一种是用 mysql 数据库存储,使用广播流。

这里选择第三种方案,主要是 MySQL 对于配置数据初始化和维护管理,使用 FlinkCDC 读取配置信息表,将配置流作为广播流与主流进行连接。

3.2.3 把流中的数据保存到对应的维度表

维度数据保存到 HBase 的表中。

3.3 DWD 层

DWD 层设计要点:

(1)DWD 层的设计依据是维度建模理论,该层存储维度模型的事实表。

(2)DWD 层表名的命名规范为 dwd_数据域_表名

3.3.1 流量域未经加工的事务事实表

主要任务

1)数据清洗(ETL)

    数据传输过程中可能会出现部分数据丢失的情况,导致 JSON 数据结构不再完整,因此需要对脏数据进行过滤。

2)分流

    本节将通过分流对日志数据进行拆分,生成四张事务事实表写入 Kafka
  • 流量域页面浏览事务事实表
  • 流量域应用启动事务事实表
  • 流量域页面动作事务事实表
  • 流量域应用关闭事务事实表
3.3.2 流量域独立访客事实表

1)数据清洗(ETL)

过滤页面数据中的独立访客(UV)访问记录

3.3.3 流量域页面访问事实表

1)数据清洗(ETL)

过滤页面数据中的访客(PV、停留时间)访问记录

3.3.4 流量域页面行为事实表

1)数据清洗(ETL)

过滤页面动作数据中的访客(show click close)访问记录

3.3.5 流量域应用启动事实表

过滤应用启动数据中的访客(启动次数、冷热启动次数)访问记录

3.3.6 流量域应用使用时长事实表

过滤应用启停数据中的访客使用时长访问记录(数据可能会有延迟)

3.3.7 用户域用户活跃事实表

过滤应用启动数据中的访客启动记录,记录活跃用户(设备)

3.3.8 用户域用户新增事实表

过滤应用启动数据中的访客启动记录,记录新增用户(设备)

3.4 DWS 层

3.4.1 流量域版本-渠道-平台粒度页面浏览各窗口汇总表

ClickHouse 建表语句

页面浏览统计表

CREATE database DataCore;
drop table if exists DataCore.dws_traffic_page_view_window;
create table if not exists DataCore.dws_traffic_page_view_window
(
    win_start_time     DateTime  COMMENT '窗口起始时间',
    win_end_time     DateTime COMMENT '窗口结束时间',
    app_ver      String COMMENT '版本号' ,
    os      String COMMENT '操作系统',
    qid     String COMMENT '渠道',
    group_qid   String COMMENT '渠道分组',
    asc_qid      String COMMENT '归因渠道',
    event   String COMMENT '事件类型' ,
    sub_event   String COMMENT '事件子类型',
    is_new      UInt64 COMMENT '新老用户状态标记' ,
    code    String COMMENT '平台code' ,
    uv      UInt64 COMMENT '独立用户访问数' ,
    pv      UInt64 COMMENT '用户访问数',
    during_time UInt64 COMMENT '当前窗口页面访问总时长' ,
    create_time DateTime COMMENT '创建时间',
    ts      UInt64 COMMENT '时间戳' 
) engine = MergeTree() partition by toYYYYMMDD(win_start_time)
order by (win_start_time, win_end_time,app_ver,os,qid,group_qid,asc_qid,sub_event,is_new,code);
3.4.2 流量域版本-渠道-平台粒度页面行为各窗口汇总表

ClickHouse 建表语句

用户行为 actions 日志记录表

drop table if exists DataCore.dws_traffic_actions_window;
create table if not exists DataCore.dws_traffic_actions_window
(
    win_start_time     DateTime  COMMENT '窗口起始时间',
    win_end_time     DateTime COMMENT '窗口结束时间',
    app_ver      String COMMENT '版本号' ,
    os      String COMMENT '操作系统',
    qid     String COMMENT '渠道',
    group_qid      String COMMENT '渠道分组',
    asc_qid      String COMMENT '归因渠道',
    is_new  UInt64 COMMENT '新老用户状态标记' ,
    code    String COMMENT '平台code' ,
    event   String COMMENT '事件类型' ,
    sub_event   String COMMENT '事件子类型',
    action      String COMMENT '动作类型',
    action_cnt   UInt64 COMMENT '动作次数' ,
    device_cnt   UInt64 COMMENT '动作设备次数' ,
    distinct_device_cnt   UInt64 COMMENT '去重动作设备次数' ,
    create_time DateTime COMMENT '创建时间',
    ts      UInt64 COMMENT '时间戳' 
) engine = MergeTree() partition by (toYYYYMMDD(win_start_time))
order by (win_start_time, win_end_time,app_ver,os,qid,group_qid,asc_qid,sub_event,action,is_new,code);
3.4.3 用户域版本-渠道-平台粒度用户启动明细表

ClickHouse 建表语句

用户注册表

drop table if exists DataCore.dws_user_register_window;
create table if not exists DataCore.dws_user_register_window
(
    app_ver      String COMMENT '版本号', 
    os      String COMMENT '操作系统',
    qid     String COMMENT '渠道',
    group_qid      String COMMENT '渠道分组',
    asc_qid      String COMMENT '归因渠道',
    code      String COMMENT '平台code' ,
    device_id  String COMMENT '设备号(用来标识用户)',
    register_time DateTime  COMMENT '注册时间',
    create_time DateTime  COMMENT '创建时间',
    ts      UInt64 COMMENT '时间戳'
) engine = ReplacingMergeTree(ts) partition by toYYYYMMDD(register_time)
order by (app_ver,os,qid,group_qid,asc_qid,code,device_id);

用户启动表

drop table if exists DataCore.dws_user_start_window;
create table if not exists DataCore.dws_user_start_window
(
    app_ver      String COMMENT '版本号', 
    os      String COMMENT '操作系统',
    qid     String COMMENT '渠道',
    group_qid      String COMMENT '渠道分组',
    asc_qid      String COMMENT '归因渠道',
    code      String COMMENT '平台code' ,
    device_id  String COMMENT '设备号(用来标识用户)',
    start_time   DateTime  COMMENT '用户启动时间',
    create_time DateTime  COMMENT '创建时间',
    ts      UInt64 COMMENT '时间戳'
) engine = ReplacingMergeTree(ts) partition by toYYYYMMDD(start_time )
order by (app_ver,os,qid,group_qid,asc_qid,code,device_id);

用户安装表

drop table if exists DataCore.dws_user_install_window;
create table if not exists DataCore.dws_user_install_window
(
    win_start_time     DateTime  COMMENT '窗口起始时间',
    win_end_time     DateTime COMMENT '窗口结束时间',
    app_ver      String COMMENT '版本号', 
    os      String COMMENT '操作系统',
    qid     String COMMENT '渠道',
    group_qid      String COMMENT '渠道分组',
    asc_qid      String COMMENT '归因渠道',
    code    String COMMENT '平台code' ,
    install_cnt      UInt64 COMMENT '安装次数',
    distinct_install_cnt UInt64 COMMENT '去重安装次数',
    create_time DateTime  COMMENT '创建时间', 
    ts      UInt64 COMMENT '时间戳' 
) engine = MergeTree() partition by toYYYYMMDD(win_start_time)
order by (win_start_time, win_end_time, app_ver,os,qid,group_qid,asc_qid,code);
3.4.4 用户域版本-渠道-平台活跃用户各窗口汇总表

ClickHouse 建表语句

活跃用户统计表

drop table if exists DataCore.dws_user_active_window;
create table if not exists DataCore.dws_user_active_window
(
    win_start_time     DateTime  COMMENT '窗口起始时间',
    win_end_time     DateTime COMMENT '窗口结束时间',
    app_ver      String COMMENT '版本号', 
    os      String COMMENT '操作系统',
    qid     String COMMENT '渠道',
    group_qid      String COMMENT '渠道分组',
    asc_qid      String COMMENT '归因渠道',
    code    String COMMENT '平台code' ,
    dau      UInt64 COMMENT '活跃用户数' ,
    start_cnt      UInt64 COMMENT '启动次数',
    cold_start_cnt UInt64 COMMENT '冷启动次数' ,
    hot_start_cnt UInt64 COMMENT '热启动次数',
    use_time UInt64 COMMENT '使用总时长' ,
    create_time DateTime  COMMENT '创建时间', 
    ts      UInt64 COMMENT '时间戳' 
) engine = MergeTree() partition by toYYYYMMDD(win_start_time)
order by (win_start_time, win_end_time, app_ver,os,qid,group_qid,asc_qid, code);
3.4.5 用户域版本-渠道-平台新增用户各窗口汇总表

ClickHouse 建表语句

新增用户统计表

drop table if exists DataCore.dws_user_new_window;
create table if not exists DataCore.dws_user_new_window
(
    win_start_time     DateTime  COMMENT '窗口起始时间',
    win_end_time     DateTime COMMENT '窗口结束时间',
    app_ver      String COMMENT '版本号' ,
    os      String COMMENT '操作系统',
    qid     String COMMENT '渠道',
    group_qid      String COMMENT '渠道分组',
    asc_qid      String COMMENT '归因渠道',
    code    String COMMENT '平台code' ,
    dnu      UInt64 COMMENT '新增用户数', 
    start_cnt      UInt64 COMMENT '启动次数',
    cold_start_cnt UInt64 COMMENT '冷启动次数' ,
    hot_start_cnt UInt64 COMMENT '热启动次数',
    use_time UInt64 COMMENT '使用总时长',  
    create_time DateTime  COMMENT '创建时间',
    ts      UInt64 COMMENT '时间戳' 
) engine = MergeTree() partition by toYYYYMMDD(win_start_time)
order by (win_start_time, win_end_time, app_ver,os,qid,group_qid,asc_qid,code);
3.4.6 支付域支付方式-客户端-商品 支付订单各窗口汇总表

ClickHouse 建表语句

支付订单统计表

drop table if exists DataCore.dws_trade_order_window;
CREATE TABLE DataCore.dws_trade_order_window
(
    `win_start_time` DateTime COMMENT '窗口起始时间',
    `win_end_time` DateTime COMMENT '窗口结束时间',
    `os` String COMMENT '操作系统',
    `product_id` String COMMENT '商品id',
    `way_code` String COMMENT '支付方式,ALI_APP、WX_APP、APPLE_APP',
    `code` String COMMENT '平台code',
    `pay_amount` Decimal64(6) COMMENT '支付金额',
    `refund_amount` Decimal64(6) COMMENT '退款金额',
    `tax_amount` Decimal64(6) COMMENT '扣税金额',
    `total_amount` Decimal64(6) COMMENT '总收益',
    `order_num` UInt64 COMMENT '订单总数量',
    `device_num` UInt64 COMMENT '付费用户总数量',
    `first_day_device_num` UInt64 COMMENT '首日付费用户总数量',
    `first_day_pay_amount` Decimal64(6) COMMENT '首日付费用户支付金额',
    `first_day_order_num` UInt64 COMMENT '首日付费用户订单总数量',
    `create_time` DateTime COMMENT '创建时间',
    `ts` UInt64 COMMENT '时间戳'
)ENGINE = MergeTree() PARTITION BY toYYYYMMDD(win_start_time)
ORDER BY (win_start_time,win_end_time,os,product_id, way_code, code);

索引

CREATE INDEX idx_sub_event ON DataCore.dws_traffic_actions_window (sub_event) TYPE minmax GRANULARITY 8192;
CREATE INDEX idx_sub_event ON DataCore.dws_traffic_page_view_window  (sub_event) TYPE minmax GRANULARITY 8192;
3.4.7 流量域版本-渠道-平台粒度用户浏览明细表

ClickHouse 建表语句

用户浏览详情表

**drop** **table** **if** **exists** DataCore.dws_user_page_view_detail;
**create** **table** **if** **not** **exists** DataCore.dws_user_page_view_detail
(
    app_ver             **String** **COMMENT** '版本号' ,
    os                  **String** **COMMENT** '操作系统',
    os_version          **String** **COMMENT** '操作系统版本号',
    device              **String** **COMMENT** '手机型号', 
    device_brand        **String** **COMMENT** '机型品牌', 
    qid                 **String** **COMMENT** '渠道',
    group_qid           **String** **COMMENT** '渠道分组',
    asc_qid             **String** **COMMENT** '归因渠道',
    is_new              **UInt64** **COMMENT** '新老用户状态标记' ,
    code                **String** **COMMENT** '平台code' ,
    device_id           **String** **COMMENT** '设备号(用来标识用户)',
    event               **String** **COMMENT** '事件类型' ,
    sub_event           **String** **COMMENT** '事件子类型',
    last_sub_event      **String** **COMMENT** '上一个事件类型',
    during_time         **UInt64** **COMMENT** '页面浏览时间' ,
    create_time         **DateTime** **COMMENT** '创建时间',
    ts                  **UInt64** **COMMENT** '时间戳',
    lab_code            **String** **COMMENT** '实验code',
    lab_group_code      **String** **COMMENT** '实验分组code'
) **engine** =MergeTree() **partition** **by** **toYYYYMMDD**(create_time)
**order** **by** (app_ver,os,qid,group_qid,asc_qid,is_new,code,device_id,event,sub_event,last_sub_event,create_time);
3.4.8 流量域版本-渠道-平台粒度用户动作明细表

ClickHouse 建表语句

用户动作详情表

**drop** **table** **if** **exists** DataCore.dws_user_page_action_detail;
**create** **table** **if** **not** **exists** DataCore.dws_user_page_action_detail
(
    app_ver             **String** **COMMENT** '版本号' ,
    os                  **String** **COMMENT** '操作系统',
    os_version          **String** **COMMENT** '操作系统版本号',
    device              **String** **COMMENT** '手机型号', 
    device_brand        **String** **COMMENT** '机型品牌', 
    qid                 **String** **COMMENT** '渠道',
    group_qid           **String** **COMMENT** '渠道分组',
    asc_qid             **String** **COMMENT** '归因渠道',
    is_new              **UInt64** **COMMENT** '新老用户状态标记' ,
    code                **String** **COMMENT** '平台code' ,
    device_id           **String** **COMMENT** '设备号(用来标识用户)',
    event               **String** **COMMENT** '事件类型' ,
    sub_event           **String** **COMMENT** '事件子类型',
    action_type         **String** **COMMENT** '动作类型,展现传show、点击传click、关闭传close',
    create_time         **DateTime** **COMMENT** '创建时间',
    ts                  **UInt64** **COMMENT** '时间戳' ,
    lab_code            **String** **COMMENT** '实验code',
    lab_group_code      **String** **COMMENT** '实验分组code'
) **engine** = MergeTree() **partition** **by** **toYYYYMMDD**(create_time)
**order** **by** (app_ver,os,qid,group_qid,asc_qid,is_new,code,device_id,event,sub_event,action_type,create_time);

4、数据可视化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1526527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ArcGISProSDK】获取扩展模块许可到期时间

结果 以下是获取的3D分析模块的许可到期时间 代码 var licenseExpirationDate ArcGIS.Core.Licensing.LicenseInformation.GetExpirationDate(LicenseCodes.Analyst3D); 扩展模块 MemberDescriptionAnalyst3D3D AnalystAviationAirportsAviation and AirportsBusinessAnal…

数目之差

解法一&#xff1a; 显然只需让多的在限度内最多即可 #include<iostream> #include<algorithm> using namespace std; #define endl \n void solve() {int n, k, num0 0, num1 0;cin >> n >> k;string s;cin >> s;for (int i 0; i < s.s…

OpenAI Q-Star:AGI距离自我意识越来越近

最近硅谷曝出一份54页的内部文件&#xff0c;揭露了去年OpenAI宫斗&#xff0c;导致Altman&#xff08;奥特曼&#xff09;差点离职的神秘项目——Q-Star&#xff08;神秘代号Q*&#xff09;。 根据该文件显示&#xff0c;Q-Star多模态大模型拥有125万亿个参数&#xff0c;比现…

linux之source.list解析

众所周知&#xff0c;linux可以通过apt命令安装软件&#xff0c;那么apt又是从哪里获取软件包呢并安装呢&#xff1f;这里就绕不开一个文件source.list&#xff0c;该文件定义了软件源相关的信息。下面以实际例子&#xff0c;详细的介绍下这个文件。 文件作用 定义软件源的信…

就业班 第二阶段 2401--3.18 初识mysql

初识&#xff1a; 1、关系型数据库mysql、mariadb、sqlite 二维关系模型 2、非关系型数据库 redis、memcached sql 四个部分 DDL 数据库定义语言 创建数据库&#xff0c;创建用户&#xff0c;创建表 DML 数据库操作语言 增删改 DQL 数据库查询语言 查 DCL 数据库控制语言 授权 …

phpstudy自定义安装mysql8.3并启动

phpstudy自定义安装mysql8.3并启动 先去官网:https://dev.mysql.com/downloads/下载压缩包文件 然后按下面的图片一步一步操作 选择版本&#xff0c;选择第一个压缩包文件&#xff0c;下载 下载完成后&#xff0c;解压到phpstudy环境目录下&#xff0c;如下图 然后进入mysq…

Ubuntu 搭建gitlab服务器,及使用repo管理

一、GitLab安装与配置 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。 1、安装Ubuntu系统&#xff08;这个教程很多&#xff0c;就不展开了&#xff09;。 2、安装gitlab社区版本&#xff0c;有需…

【每日一题】区域和检索 - 数组不可变

文章目录 Tag题目来源解题思路方法一&#xff1a;自定义前缀和数组方法二&#xff1a;使用 accumulate() 实现前项求和 写在最后 Tag 【前缀和】【数组】【2024-03-18】 题目来源 303. 区域和检索 - 数组不可变 解题思路 方法一&#xff1a;自定义前缀和数组 前缀和的基础知…

第四百零二回

文章目录 知识回顾示例代码经验总结 我们在上一章回中介绍了MethodChannel的使用方法&#xff0c;本章回中将介绍EventChannel的使用方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 知识回顾 我们在前面章回中介绍了通道的概念和作用&#xff0c;并且提到了通道有不同的…

如何突破DRAM对SSD容量提升的限制?

近日小编看到Pure Storage公司的研发高级副总裁肖恩罗斯马林(Shawn Rosemarin)的一个观点“由于DRAM的局限性&#xff0c;固态硬盘(SSD)的容量难以突破30TB”。 这个观点不是完全准确&#xff0c;实际上&#xff0c;Solidigm已经发布了最大容量61.44TB QLC SSD。 但是&#xf…

AI 初创公司趋势:Y Combinator 最新批次的见解

总部位于硅谷的著名创业加速器 Y Combinator (YC) 最近宣布了其 2023 年冬季队列&#xff0c;不出所料&#xff0c;约 31% 的初创公司&#xff08;269 家中有 80 家&#xff09;拥有自我报告的 AI 标签。在这篇文章中&#xff0c;我分析了这批 20-25 家初创公司&#xff0c;以了…

深度剖析:数字经济下人工智能水平的新测算模型数据集

数据来源&#xff1a;企业年报时间跨度&#xff1a;1991-2022年数据范围&#xff1a;各企业数据指标&#xff1a; 年份 股票代码 公司名称 总词频 词频加1取对数 人工智能 计算机视觉 图像识别 知识图谱 智能教育 增强现实 智能政务 特征提…

Leetcode刷题笔记——动态规划(背包问题)篇

Leetcode刷题笔记——动态规划&#xff08;背包问题&#xff09;篇 一、0-1 背包问题 0-1背包问题简介 有 n 件物品和一个最多能背重量为 w 的背包。第 i 件物品的重量是 weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包…

HTML学习:图片格式——超链接

一、图片格式 1.jpg格式 概述:扩展名为.jpg 或.jpeg &#xff0c;是一种有损的压缩格式(把肉眼不容易观察出来的细节丢弃了)。 主要特点:支持的颜色丰富、占用空间较小、不支持透明背景、不支持动态图。 使用场景:对图片细节没有极高要求的场景&#xff0c;例如:网站的产品…

容器数据卷

目录 一、容器数据卷概念 二、使用数据卷 2.1直接使用命令来挂载 三、实战测试 四、具名挂载和匿名挂载 4.1匿名挂载举例&#xff1a; 4.2具名挂载举例&#xff1a; 五、数据卷容器 一、容器数据卷概念 数据&#xff1f;如果数据都在容器中&#xff0c;那么容器删除&am…

linux(Ubuntu22) 一篇带你学会Linux,详细篇

Linux 简介 精通Linux&#xff0c;自带python&#xff0c;系统开源 电脑可安装双系统 c盘安装win D盘安装linux 在一套硬件上只能同时运行一个操作系统 虚拟机 模拟真实环境 在虚拟机内运行操作系统 需要硬件支持虚拟化 开启VT-X VM…

Web基础06-AJAX,Axios,JSON数据

目录 一、AJAX 1.概述 2.主要作用 3.快速入门 4.AJAX的优缺点 &#xff08;1&#xff09;优点 &#xff08;2&#xff09;缺点 5.同源策略 二、Axios 1.概述 2.快速入门 3.请求方式别名 三、JSON 1.概述 2.主要作用 3.基础语法 4.JSON数据转换 &#xff08;1…

洛谷_P1152 欢乐的跳_python写法

思路&#xff1a; 这道题我用到了集合的互异性来判断这组数字是否满足条件我觉得是比较有效一点的。 data list(map(int,input().split())) data data[1:] l [i for i in range(1,len(data))] s [] for i in range(len(data)-1):s.append(abs(data[i] - data[i1]))if set(…

RVA和FOA转换---三

文章目录 修改初始值RVA和FOA转换RVAFOARVA和FOA的关系 本次内容包含如何修改程序中的初始值&#xff0c;和如何转换内存和文件的地址。 修改初始值 问题&#xff1a; 我们写了一个程序&#xff0c;可以输出一个结果&#xff0c;那么我们可以通过修改PE文件来改变这个输出结果…

平时到点就走的00后,居然一跃上岸字节,真的难以接受....

又到了一年一度的求职旺季金&#xff01;三&#xff01;银&#xff01;四&#xff01;在找工作的时候都必须要经历面试这个环节。在这里我想分享一下自己上岸字节的面试经验&#xff0c;过程还挺曲折的&#xff0c;但是还好成功上岸了。大家可以参考一下&#xff01; 0821测评 …