超多分析结果表 简单字段关联 生成大宽表 的 初步猜想

业务背景:

1. 广告投放涉及到用户的诸多特征

2. 用户特征通常不在同一个表中

3. 通过各种算法逻辑会产生很多的中间表

4. 各中间表的唯一标志基本为单一字段,通常会员标志或设备标志(两者一般取较新的一对组合使用)

5. 进入算法(或机器学习)前,需要一个统一的大宽表作为入参方便取值

业务解析:

1. 若干(通常10+)结果表

2. 每张表的数据量都很大(千万-亿)

3. 每个表都有同样的唯一标志字段(具体内容不同)

结果表产生过程隐藏条件:

1. 存在一张主表,包含有所有可能的唯一标志

处理流程:

1. 对所有表的唯一标志数字化

2. 对数字化后的各表进行排序

3. 遍历主表

3.1. 取出主表一条记录,与其他各表取出的一条比较

3.2  如果主表唯一标志和各表相等,将各表数据并入主表,然后取出下一条记录

3.3  如果唯一标志不想等,使用默认值并入主表,维持当前记录

3.4  将合并的记录记下,进入下次循环

4. 完成主表遍历后,写入磁盘

猜想:

1. 使用插入排序后,经历两次主表遍历读写便可完成大宽表的合成

2. 和使用left join相比,避开指数级增长的子表遍历

3. 和使用union all相比,避开了最终的分组求和过程

4. 在子表数据量级不大且数量不多时,使用left join书写较为方便

5. 在主表基数不是很大时,union all不会在分组求和花费过多时间

原文地址:https://www.cnblogs.com/qq1144054302/p/10311964.html

时间: 2024-08-23 04:44:17

超多分析结果表 简单字段关联 生成大宽表 的 初步猜想的相关文章

超多分析结果表 简单字段关联 生成大宽表 的 并发拓展

年前有些放纵了,一直没有完成该篇的节奏感.推延至今 大数据量面前单机显然是不合适的,所以尝试将前述逻辑 并发化 考虑 以适应 分布式处理. 回溯数据清洗流程, 1.流量数据区间圈定, 2.流量数据按要求筛选聚合 3.各汇总表按唯一标志联合 在初步猜想中,需要一张包含所有唯一标志的主表,这也是减少匹配次数的关键. 主表的产生不应该到流程第三步,也完全没有必要. 清洗流程第二步流量数据聚合的同时,完全可以完成 该主表的去重和排序. 接下来按照 记录总数均匀分发主表数据到个 executor,并记录下

Oracle group by 多表多字段关联查询

group by 多表多字段关联查询 自己遇到一个问题,就是开始的时候需要一个字段的名字和数量,但是是同个一个表的. 数据库代码如下: select  l.batchnum,count(l.batchnum) batcount    from ts_outphone_list l join ts_outphone_batch b on l.batchnum=b.batchnum left join om_user_list om on l.datamanager=om.login_id left

Oracle中用一张表的字段更新另一张表的字段

今天在做项目的过程中,发现开发库中某张表的某字段有许多值是空的,而测试库中该字段的值则是有的. 那么,有什么办法能将测试库中该字段的值更新到开发库中呢? SQL Server中这是比较容易解决的,而Oracle中就不知道方法了. SQL Server中类似问题的解决方法 后来只好用最笨的方法: 首先,将数据复制到Excel:(假设称测试库的表为A--含有数据) 然后,在开发库中建立和表A同结构的表B:(这里为了导入数据的简单,我对表B的结构进行了改造,只有两个字段) 图 表B的数据 再利用PL

SQL数据表两个字段关联同一张数据表

数据表temp结构 -- Table "temp" DDL CREATE TABLE `temp` ( `page_id` bigint(20) DEFAULT NULL, `section_id` bigint(20) DEFAULT NULL, `visit_category_id` bigint(20) DEFAULT NULL, `cart_category_id` bigint(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=

两表通过字段关联进行级联删除。

create table ta(id int not null) create table tb(id int , aid int) insert into ta values(1) insert into ta values(2) insert into tb values(1 , 1) insert into tb values(2 , 2) insert into tb values(3 , 1) go --一.查看原始数据 --ta表的原始数据 select * from ta /* i

mysql 一张表的多个字段关联另外一张表

SELECT vtiger_orderitem.orderid, ( SELECT vtiger_users.last_name FROM vtiger_users WHERE vtiger_orderitem.signatory = vtiger_users.id ) AS signatory, ( SELECT vtiger_users.last_name FROM vtiger_users WHERE vtiger_orderitem.servicer = vtiger_users.id

将一个表的字段更新到另一个表中去

描述 做一个需求需要记录用户留下签字意见时的职位信息,并且签字意见中留下的职位信息不随他的职位的调动变化而变化.在标准产品的签字意见表里面没有记录职位信息的字段,这就需要我们添加一个字段用于存储当前操作者的职位信息,对于新的数据我们可以在插入签字意见的时候一并插入.但是对于历史数据,我们就需要通过SQL来更新,这样在升级客户系统的时候直接运行一个SQL脚本就将历史数据的职位字段更新为记录的操作者当前的职位信息. 假设表HRM表示用户表,结构如下: 字段名字 类型 备注 ID NUMBER 用户i

mysql把一个表的字段update成另一个表的字段根据id

1.填充activity表里面的creator字段,用org的founderid,其中activity的orgid要和org的id对应,具体sql语句如下:update activity a inner join (select id,founderid from org o) c on a.orgid =c.id  set a.creator = c.founderid;

将B表的字段内容插入到A表字段中

update hy_b_hacker as h , ( SELECT ( @rowNO := @rowNo +1 ) AS rowno, ip FROM ( SELECT * FROM hy_b_sendlog GROUP BY ip )a, ( SELECT @rowNO :=0 )b ) as i set h.ip=i.ip where h.id=i.rowno;