交通

更新时间:

本章节以简化的业务场景来介绍车辆通行的最佳实践。

业务场景和要求

本例中简化的业务场景:记录主要交通路口(卡口)的车辆通行信息。要求:

  • 每日有一亿的实时增量数据,数据需要存储五年。

  • 可实时查询每个路口车辆通行情况。例如:某一时间段通过该路口的车辆总数、车辆详单信息等。

  • 可按车辆拍照号码查询一段时间内的车辆的详单信息。

表的逻辑设计

车辆信息表(t_fact_vehicle_info)

字段名 字段类型 说明
uuid varchar 唯一标识
access_time varchar 接收时间
gate_number varchar 卡口编码
device_num varchar
pass_time varchar 过车时间
vehicle_number varchar 号牌号码
vehicle_num_type varchar 号牌种类
speed double 行驶速度
picture_url varchar
pt_month

表的物理设计

  • 按车辆拍照进行HASH一级分区,可均匀的将数据分布到所有分区上。

  • 按卡口编号设置聚集列。

  • 二级分区按月存储,存储五年(60个月的数据),设置二级分区数为61。

创建表组

根据业务场景和要求,创建以下表组和表:

  1. create tablegroup app_group;

创建t_fact_vehicle_info表

  1. CREATE TABLE t_fact_vehicle_info (
  2. uuid varchar NOT NULL COMMENT '唯一标识',
  3. access_time varchar DEFAULT '0' COMMENT '接收时间',
  4. gate_number varchar DEFAULT '0' COMMENT '卡口编码',
  5. device_num varchar DEFAULT '0' COMMENT '',
  6. pass_time varchar DEFAULT '0' COMMENT '过车时间',
  7. vehicle_number varchar DEFAULT '' COMMENT '号牌号码',
  8. vehicle_num_type varchar DEFAULT '' COMMENT '号牌种类',
  9. speed double DEFAULT 0 COMMENT '行驶速度',
  10. picture_url varchar DEFAULT '' COMMENT '',
  11. pt_month bigint COMMENT '',
  12. PRIMARY KEY (uuid,vehicle_number,pt_month)
  13. )
  14. PARTITION BY HASH KEY (vehicle_number) PARTITION NUM 256
  15. SUBPARTITION BY LIST KEY (pt_month)
  16. SUBPARTITION OPTIONS (available_partition_num = 61)
  17. CLUSTERED BY (gate_number)
  18. TABLEGROUP app_group
  19. OPTIONS (UPDATETYPE='realtime')
  20. COMMENT '过车信息';

查询SQL

查询某车牌号码某一段时间内的详单数据:

  1. select * from t_fact_vehicle_info
  2. where vehicle_number='xxxxx'
  3. and pass_time between '2017-10-10 09:00:00'
  4. and '2018-03-01 10:00:00'
  5. and pt_month between 20171010 and 20180301;

查询30分钟内某一路口通过车辆总数信息:

  1. select count(*) from t_fact_vehicle_info
  2. where gate_number='xxxxx'
  3. and pass_time between '2018-03-01 09:00:00' and '2018-03-01 09:30:00'
  4. and pt_month =20180301;