实时数仓案例(电商)

0 架构

1 ods

1 日志数据

前端(jar,产生日志数据)-》Nginx(集群间负载均衡)-》日志服务器(springboot,采集数据,jar)-》log,ods(kafka)

本地测试,本地起应用 -》 单机部署,单服务器起应用 -》 集群部署,集群起应用

2 业务数据

前端,jar,产生业务数据-》mysql,配置什么同步-》flinkcdc-》ods(kafka)

2 dim、dwd

1 用户行为日志

ods(Kafka)-> flink -> dwd(kafka)

1 识别新老用户

业务需要

2 日志数据拆分

这3类日志,结构不同,写回Kafka不同主题

2 业务数据

ods(kafka) -> flink -> 1 维度数据,dim(HBASE) 2 事实数据 dwd(kafka)

1 ETL

过滤控制

2 动态分流

维度数据到hbase 事实数据到kafka

怎么分流?

ods的表里面哪些是维度表,哪些是事实表,需要提前知道表的分类信息,后面才可以分流。业务库的表会变化,表的分类信息实时更新,需要动态同步。这里将表的分类信息存在mysql,利用广播流发送。

3 dwm

dmd(kafka)-> flink -> dwm(kafka)

1 访问uv计算

UV,unique visitor

2 跳出明细计算

跳出率=跳出次数 / 访问次数

3 订单主题表

4 支付主题表

4 dws

dwm(kafka)-> flink -> dws(clickhouse)

1 访客主题宽表

2 商品主题宽表

3 地区主题表

4 关键词主题表

5 ads

pytorch常见问题

1 Gather function not implemented for CPU tensors

多卡训练时候,net的forward里面存在Tensor变成其它类型的操作,比如变成numpy,list

解决:改成Tensor操作

2 RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn

https://blog.csdn.net/weixin_41990278/article/details/90311313

https://blog.csdn.net/wu_xin1/article/details/116502378

分层结构

DWM

https://blog.csdn.net/jianghuaijie/article/details/122009653

作用

DWM层的定位是什么,DWM层主要服务DWS,因为部分需求直接从DWD层到DWS层中间会有一定的计算量,而且这部分计算的结果很有可能被多个DWS层主题复用

构建

分主题

dwt

实时数仓没有dwt,因为dwt是累计统计,实时系统不适用

dws

作用

轻度聚合,生成一系列的中间表,提升公共指标的复用性,减少重复加工

分主题,便于管理

构建

分主题

宽表

轻度聚合

python bif(内置函数)

1 ord

如何获取ascii码,使用内置函数ord()

1
2
3
4
ord("A")
65
ord("a")
97

804. 唯一摩尔斯密码词

2 sorted

https://www.runoob.com/python3/python3-func-sorted.html

1
2
3
4
sorted([-3,4,2],key=abs)
Out[5]: [2, -3, 4]
sorted([-3,4,2])
Out[6]: [-3, 2, 4]

3 iter 和 next函数

4 dir

https://www.runoob.com/python/python-func-dir.html

5 filter

只保留true,过滤false

filter(lambda x:x%2==0,[1,2,3,4,5]) [2,4]

信息抽取 Information Extraction

简介

信息抽取是基于已有信息筛选出目标信息,不是无中生有,生成是有无中生有的能力

信息抽取主要包括三个子任务:命名实体识别、关系抽取、事件抽取。

实体抽取又称命名实体识别,其目的是从文本中抽取实体信息元素。想要从文本中进行实体抽取,首先需要从文本中识别和定位实体,然后再将识别的实体分类到预定义的类别中去

关系抽取是知识抽取的重要子任务之一,面向非结构化文本数据, 关系抽取是从文本中抽取出两个或者多个实体之间的语义关系。关系抽取与实体抽取密切相关,一般在识别出文本中的实体后,再抽取实体之间可能存在的关系,也有很多联合模型同时将这两个任务一起做了的;

事件抽取是指 从自然语言文本中抽取出用户感兴趣的事件信息,并以结构化的形式呈 现出来,例如事件发生的时间、地点、发生原因、参与者等。跟关系抽取有重叠的地方,同样也可以分为流水线方法和联合抽取方法。

例子:

1.NER命名实体识别 (实体抽取):从文本中检测出命名实体,并将其分类到预定义的类别中,例如人物、组织、地点、时间等。图中高灰色记的文字就是命名实体,在一般情况下,命名实体识别是知识抽取其他任务的基础。
2.关系抽取 :从文本中识别抽取实体及实体之间的关系。例如,从句子“[王思聪] 是万达集团董事长[王健林]的独子”中识别出实体“[王健林]”和“[王思 聪]”之间具有“父子”关系。
3.事件抽取:识别文本中关于事件的信息,并以结构化的形式呈现。例如,从恐怖袭击事件的新闻报道中识别袭击发生的地点、时间、袭击目标和受害人等信息。

参考

https://zhuanlan.zhihu.com/p/183966841

https://zhuanlan.zhihu.com/p/376898772

https://zhuanlan.zhihu.com/p/352513650

hive优化

https://blog.csdn.net/yu0_zhang0/article/details/81776459

1 索引

https://www.jianshu.com/p/28b825367ba1

https://www.jianshu.com/p/d53f528daca7

Hive索引的目标是提高对表的某些列进行查询查找的速度。

索引所能提供的查询速度的提高是以存储索引的磁盘空间为代价的。

Hive 3.0开始将 移除index的功能,取而代之的是Hive 2.3版本开始的物化视图,自动重写的物化视图替代了index的功能。

2 物化视图

https://blog.csdn.net/u011447164/article/details/105790713

区别于普通视图

1
2
3
4
5
create materialized view view2
as
select dept.deptno,dept.dname,emp.ename
from emp,dept
where emp.deptno=dept.deptno;

dfs,bfs

https://www.jianshu.com/p/a753d5c733ec

dfs

1 递归实现

1
2
3
def dfs(当前节点,子节点)
for node in 子节点
dfs(node,new 子节点)

310. 最小高度树

1
2
#### root 当前节点 path子节点 depth 深度
dfs(root,path,depth)

695. 岛屿的最大面积

1
2
###grid全部格点 cur_i,cur_j 当前节点的位置,用+1-1可以确定子节点
dfs(self, grid, cur_i, cur_j) :

2 迭代实现

bfs

1 迭代实现

root进队,root出队,root的子节点【a,b,c】进队,a出队,a的子节点进队,b出队,b的子节点进队。。。

访问顺序(出队顺序):root a b c 。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution:
def levelOrder(self, root: 'Node') -> List[List[int]]:
if root==None:
return []
ans = []
q = [root]
while q:
# length = len(q)
# arr = []
# for _ in range(length):
node = q.pop(0)
# arr.append(node.val)
for chd in node.children:
q.append(chd)
# if arr:
ans.append(node.val)
return ans

429. N 叉树的层序遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution:
def levelOrder(self, root: 'Node') -> List[List[int]]:
ans = [] ##结果
q = [root] ##队列
while q:
length = len(q)
arr = [] #出队
for _ in range(length):
node = q.pop(0)
if not node:
continue
arr.append(node.val)
for chd in node.children:
q.append(chd)
if arr:
ans.append(arr)
return ans

2 递归实现

应用选择

时间复杂度都为O(n),n为全部节点

  1. BFS是用来搜索最短径路的解是比较合适的,比如求最少步数的解,最少交换次数的解,因为BFS搜索过程中遇到的解一定是离根最近的,所以遇到一个解,一定就是最优解,此时搜索算法可以终止。这个时候不适宜使用dfs,因为DFS搜索到的解不一定是离根最近的,只有全局搜索完毕,才能从所有解中找出离根的最近的解。(当然这个DFS的不足,可以使用迭代加深搜索ID-DFS去弥补)
  2. DFS适合搜索全部的解,而正因为要搜索全部的解,那么BFS搜索过程中,遇到离根最近的解,并没有什么用,也必须遍历完整棵搜索树;DFS搜索会搜索全部,但是相比之下 DFS不用记录过多信息,所以搜素全部解的问题,DFS显然更加合适。空间优劣上,DFS是有优势的,DFS不需要保存搜索过程中的状态,而BFS在搜索过程中需要保存搜索过的状态,而且一般情况需要一个队列来记录。

和回溯的关系

回溯是算法思想,dfs和bfs是搜索解空间的手段

参考

https://www.jianshu.com/p/e81a16a6f771

https://blog.csdn.net/weixin_41894030/article/details/95317440


:D 一言句子获取中...