本篇文章使用纽约市2009-1015年关于出租车驾驶的公共数据集,模拟现实数据流,获取一定时间内收入最高的出租车司机。
输入输出
输入: 详见下面数据集
输出:每个小时收入收入topN的driverId.
额外条件:
模拟丢失数据。每n条记录丢失一条数据。
数据集
网站New York City Taxi & Limousine Commission提供了关于纽约市从2009-1015年关于出租车驾驶的公共数据集。
- 下载:
1
2wget http://training.ververica.com/trainingData/nycTaxiRides.gz
wget http://training.ververica.com/trainingData/nycTaxiFares.gz
TaxiRides 行程信息。每次出行包含两条记录。分别标识为 行程开始start 和 行程结束end。
数据集结构
1 | rideId : Long // 唯一行程id |
TaxiRides 数据示例

TaxiFares 费用信息。 与上面行程信息对应
1 | rideId : Long // 唯一行程id |
TaxiFares 数据示例

分析
通过上面的数据集以及输入输出的要求,可以分析如下:
先根据上满两个数据集,生成输入流。再根据ridrId进行join,对join的结果进行窗口分割,最后对窗口内的数据入库计算收入最高的n个driverId.
思路
- 生成数据流。(读取上面两个数据集)
- 模拟丢失数据 filter
- 根据routId 将两个输入流join (这里其实是过滤掉了filter过滤掉的数据的对应数据)
- 对上面join的结果划分窗口,并以driverId分组计算窗口内收入,(这里就是简单对taxiFare进行取topN)
- 选出topN
- 输出。
部分核心实现
新建两个class 表示ride和fare 完整代码
对应source 完整代码
主要逻辑 完整代码
1 | public static void main(String[] args) throws Exception { |
运行结果

参考
[ververica]https://training.ververica.com/