我决定放弃所有花里胡哨的发言,就简单直接的上干货吧
①业务场景:
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