时空碰撞系列·终

本文探讨了在大数据环境下,针对上亿条数据进行时空碰撞计算的问题。目前的方案存在计算繁琐和内存压力大的痛点。通过分析数据来源和优化计算过程,提出仅计算经纬度核心字段并构建虚拟设备关联表的策略,以减少计算量和shuffle内存,实现时空碰撞的高效计算。具体步骤包括数据预处理、空间配对、时间配对和最终的join操作,从而达到预期的优化目标。
摘要由CSDN通过智能技术生成

我决定放弃所有花里胡哨的发言,就简单直接的上干货吧

 

①业务场景:

1.需要计算时间和空间都在一定范围内的数据对,数据来源可能有多种类型,人、车、码等

2.单机计算,数据量上亿

 

②当前方案:

拆分join流程,把三个维度拆成2+1,先用in逻辑过滤一部分数据,再扩充一次,再join

 

③当前痛点:

1.步骤过于繁琐,会重复调用全量数据

2.join的时候是按时空块join的,按块join会导致每个join成功的块中数据量较大,集群版无所谓,单机版计算上亿数据量shuffle会比较吃力

 

④预期目标

1.减小计算量

2.减小shuffle内存

 

⑤优化思路

1.审视数据来源。数据来源于各种固定的采集设备。如果数据来源是卫星或者移动的采集设备,经纬度会存在无法确定个数量,但固定设备的情况下,所有输出的经纬度即为设备本身的经纬度。因此,我们能确定哪些设备之间的距离本身就在我们的要求范围内。

2.抽出核心计算。此前的计算我们都是对经纬度和时间进行全量计算,扩充的时候全字段会浪费很多内存,基于上一步我决定只使用经纬度对应的字段进行一次计算,得到一张虚拟设备关联表,这张表记录的是空间距离信息;再对时间进行全量计算,得到时间距离信息,最终通过时空距离信息join来得到最终的时空碰撞结果

 

⑥优化方案

test:原表,存储需要计算的数据

时间间隔10S

空间间隔100米

①初始数据处理,构建各种需要的字段

with event as (
select
id,
type,
time,
time_part,
lat,
lon,
lat_part,
lon_part,
location
from(
    select
    id,
    type,
    time,
    floor(unix_timestamp(time)/10) as time_part,
    lat,
    lon,
    floor(lat/0.001) as lat_part,
    floor(lon/0.001) as lon_part,
    location,
    row_number() over(partition by id,time,location or
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值