
1) 【一句话结论】处理船舶AIS数据时,需通过数据清洗(异常/缺失处理)+ 时间窗口/哈希去重(保留有效数据)+ 复合B树索引优化(加速查询),以提升数据质量和查询性能。
2) 【原理/概念讲解】数据清洗流程分三步:
去重方法中,时间窗口去重适合实时数据流(保留最新状态),哈希去重适合批量处理(高效去重)。索引优化:为时间戳和MMSI字段创建复合B树索引,因为查询常按时间范围和MMSI筛选,复合索引能加速范围查询(避免全表扫描)。
3) 【对比与适用场景】
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 时间窗口去重 | 基于时间戳的滑动窗口,保留窗口内每个MMSI的最新记录 | 保留最新状态,适用于实时流 | 实时AIS数据流处理 | 窗口大小需根据数据更新频率调整 |
| 哈希去重 | 通过哈希函数生成唯一标识,相同标识合并为一条记录 | 快速计算,适用于大数据量 | 批量数据处理(如每日数据清洗) | 需要足够内存存储哈希表 |
| 基于主键去重 | 直接利用数据库主键唯一性,删除重复记录 | 简单直接,依赖主键定义 | 关系型数据库中主键已定义的情况 | 需要确保主键唯一,否则无效 |
4) 【示例】(伪代码,处理AIS数据表ais_data,字段:timestamp、mmsi、latitude、longitude):
# 数据清洗流程
def clean_ais_data(data):
valid_data = []
for record in data:
if -10 < (record['timestamp'] - datetime.now()).total_seconds() < 10: # 时间戳合理
if -90 <= record['latitude'] <= 90 and -180 <= record['longitude'] <= 180: # 位置合理
valid_data.append(record)
else:
continue # 异常时间戳丢弃
# 缺失值处理(位置缺失用前一个有效记录填充)
cleaned_data = []
prev_record = None
for record in valid_data:
if record['latitude'] is None or record['longitude'] is None:
if prev_record:
record['latitude'] = prev_record['latitude']
record['longitude'] = prev_record['longitude']
cleaned_data.append(record)
prev_record = record
return cleaned_data
# 时间窗口去重(滑动窗口5分钟)
def deduplicate_by_time_window(data, window_size_minutes=5):
from collections import deque
deduped = []
window = deque()
for record in data:
current_time = record['timestamp']
# 移除过期记录
while window and current_time - window[0]['timestamp'] > timedelta(minutes=window_size_minutes):
window.popleft()
# 检查是否已存在
for r in window:
if r['mmsi'] == record['mmsi']:
r['latitude'] = record['latitude']
r['longitude'] = record['longitude']
break
else:
window.append(record)
deduped.append(record)
return deduped
# 索引优化(SQL示例)
# CREATE INDEX idx_ais_time_mmsi ON ais_data (timestamp, mmsi);
# 查询示例:SELECT * FROM ais_data WHERE mmsi = 123456 AND timestamp BETWEEN NOW() - INTERVAL 1 HOUR AND NOW();
5) 【面试口播版答案】
面试官您好,处理船舶AIS数据时,核心是通过数据清洗(异常/缺失处理)+ 时间窗口去重(保留最新状态)+ 复合B树索引优化(加速查询),以提升数据质量和查询性能。具体来说,数据清洗分三步:1. 异常值检测,比如时间戳是否在当前时间±10分钟内(船舶AIS更新频率通常较快,超出范围视为异常);2. 缺失值处理,位置坐标缺失时用前一个有效记录填充;3. 去重,采用时间窗口去重,滑动窗口5分钟,保留每个MMSI的最新记录(因为船舶位置会更新,保留最新状态更符合业务需求)。去重方法中,时间窗口去重适合实时数据流,哈希去重适合批量处理。索引优化方面,为时间戳和MMSI字段创建复合B树索引,因为查询常按时间范围和MMSI筛选,复合索引能加速范围查询(比如查询某个MMSI最近1小时内的数据,索引能快速定位到相关记录,避免全表扫描)。这样处理后,数据质量提升(异常/缺失数据减少),查询性能也优化了(索引加速查询)。
6) 【追问清单】
7) 【常见坑/雷区】