(60).双流合并实现

除了事实表与维表进行合并形成宽表,还需要事实表与事实表进行合并形成更大的宽表。
3.1 双流合并的问题
由于订单流和订单明细流,两个流的数据是独立保存,独立消费,很有可能同一业务的
数据,分布在不同的批次。因为 join 算子只 join 同一批次的数据。如果只用简单的 join 流
方式,会丢失掉不同批次的数据。

 

3.2 解决策略
3.2.1 通过缓存
思路
两个流做满外连接因为网络延迟等关系,不能保证每个窗口中的数据 key 都能匹配上,
这样势必会出现三种情况:(Some,Some),
(None,Some),
(Some,None),根据这三种情
况,下面做一下详细解析:
(Some,Some)
1 号流和 2 号流中 key 能正常进行逻辑运算,但是考虑到 2 号流后续可能会有剩下的
数据到来,所以需要将 1 号流中的 key 保存到 redis,以等待接下来的数据
(None,Some)
找不到 1 号流中对应 key 的数据,需要去 redis 中查找 1 号流的缓存,如果找不到,
则缓存起来,等待 1 号流
(Some,None)
找不到 2 号流中的数据,需要将 key 保存到 redis,以等待接下来的数据,并且去 reids
中找 2 号流的缓存,如果有,则 join,然后删除 2 号流的缓存
优点
不会造成数据重复
缺点
缓存处理代码编写复杂,尤其是流 join 比较多的情况。

 3.2.2 通过滑动窗口+数据去重

优点
处理代码相对简单
缺点
会造成数据重复,需要对重复数据进行处理
注意:必须是滑动窗口,如果是滚动的话,也没有解决 join 问题。

 

3.3 双流 Join 处理代码
创建 OrderWide 样例类,用于封装订单以及订单明细信息

 

 

 在 OrderWideApp 里面添加

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是双流网络的 PyTorch 实现示例: ```python import torch import torch.nn as nn class TwoStreamNet(nn.Module): def __init__(self, num_classes=10): super(TwoStreamNet, self).__init__() # Spatial stream self.spatial_conv1 = nn.Conv2d(3, 96, kernel_size=7, stride=2, padding=2) self.spatial_pool1 = nn.MaxPool2d(kernel_size=3, stride=2) self.spatial_norm1 = nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75) self.spatial_conv2 = nn.Conv2d(96, 256, kernel_size=5, stride=2, padding=1) self.spatial_pool2 = nn.MaxPool2d(kernel_size=3, stride=2) self.spatial_norm2 = nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75) self.spatial_conv3 = nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1) self.spatial_conv4 = nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1) self.spatial_conv5 = nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1) self.spatial_pool5 = nn.MaxPool2d(kernel_size=3, stride=2) # Temporal stream self.temporal_conv1 = nn.Conv2d(3, 96, kernel_size=7, stride=2, padding=2) self.temporal_pool1 = nn.MaxPool2d(kernel_size=3, stride=2) self.temporal_norm1 = nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75) self.temporal_conv2 = nn.Conv2d(96, 256, kernel_size=5, stride=2, padding=1) self.temporal_pool2 = nn.MaxPool2d(kernel_size=3, stride=2) self.temporal_norm2 = nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75) self.temporal_conv3 = nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1) self.temporal_conv4 = nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1) self.temporal_conv5 = nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1) self.temporal_pool5 = nn.MaxPool2d(kernel_size=3, stride=2) # Fully connected layers self.fc6 = nn.Linear(4096, 4096) self.dropout6 = nn.Dropout(p=0.5) self.fc7 = nn.Linear(4096, 4096) self.dropout7 = nn.Dropout(p=0.5) self.fc8 = nn.Linear(4096, num_classes) def forward(self, x): # Split the input into spatial and temporal streams spatial = x[:, :, :, 0:224] temporal = x[:, :, :, 224:448] # Spatial stream forward spatial = self.spatial_conv1(spatial) spatial = self.spatial_pool1(spatial) spatial = self.spatial_norm1(spatial) spatial = nn.functional.relu(spatial) spatial = self.spatial_conv2(spatial) spatial = self.spatial_pool2(spatial) spatial = self.spatial_norm2(spatial) spatial = nn.functional.relu(spatial) spatial = self.spatial_conv3(spatial) spatial = nn.functional.relu(spatial) spatial = self.spatial_conv4(spatial) spatial = nn.functional.relu(spatial) spatial = self.spatial_conv5(spatial) spatial = self.spatial_pool5(spatial) spatial = nn.functional.relu(spatial) spatial = spatial.view(spatial.size(0), -1) # Temporal stream forward temporal = self.temporal_conv1(temporal) temporal = self.temporal_pool1(temporal) temporal = self.temporal_norm1(temporal) temporal = nn.functional.relu(temporal) temporal = self.temporal_conv2(temporal) temporal = self.temporal_pool2(temporal) temporal = self.temporal_norm2(temporal) temporal = nn.functional.relu(temporal) temporal = self.temporal_conv3(temporal) temporal = nn.functional.relu(temporal) temporal = self.temporal_conv4(temporal) temporal = nn.functional.relu(temporal) temporal = self.temporal_conv5(temporal) temporal = self.temporal_pool5(temporal) temporal = nn.functional.relu(temporal) temporal = temporal.view(temporal.size(0), -1) # Concatenate the spatial and temporal streams out = torch.cat([spatial, temporal], dim=1) # Fully connected layers out = self.fc6(out) out = nn.functional.relu(out) out = self.dropout6(out) out = self.fc7(out) out = nn.functional.relu(out) out = self.dropout7(out) out = self.fc8(out) return out ``` 这是一个简单的双流网络,其中包含一个空间流和一个时间流,每个流都有自己的卷积和池化层。两个流在最后一个全连接层之前合并。这个模型可以根据需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据开发工程师-宋权

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值