我们正在使用U-SQL从一组.csv文件中提取传感器数据。每条记录包含传感器ID,测量时间和值,以及收到记录的时间:
+----------+---------------------+------------------+---------------------+
| SensorID | MeasurementTime | MeasurementValue | ReceivedTime |
+----------+---------------------+------------------+---------------------+
| xxx | 2017-09-10 11:00:00 | 12.342 | 2017-09-19 14:25:17 |
| xxx | 2017-09-10 12:00:00 | 14.654 | 2017-09-19 14:25:17 |
| yyy | 2017-09-10 11:00:00 | 1.054 | 2017-09-19 14:25:17 |
| yyy | 2017-09-10 12:00:00 | 1.354 | 2017-09-19 14:25:17 |
...
| xxx | 2017-09-10 11:00:00 | 10.261 | 2017-09-19 15:25:17 |
+----------+---------------------+------------------+---------------------+
文件存储在ADLS中基于测量时间的日期部分的路径中,因此上面看到的数据可以在/Data/2017/09/10/measurements.csv
中找到,其中前四行是在14:25写的: 9月19日17日,最后一行在一小时后,15:25:17附加。
如上例所示,可以在以后接收相同SensorID和MeasurementTime的新值。每个分区包含几百万行,每天有几千行附加到少量分区。我们希望每24小时运行一次批处理作业,对于任何给定的SensorID和MeasurementTime,它将仅输出最新值。为此,我们使用类似于此的U-SQL脚本:
@newestMeasurements_addRN =
SELECT *,
ROW_NUMBER() OVER (PARTITION BY PDate,
SensorId,
MeasurementTime
ORDER BY ReceivedTime DESC) AS MeasurementRN;
@newestMeasurements =
SELECT SensorId,
MeasurementTime,
MeasurementValue
FROM @newestMeasurements_addRN
WHERE MeasurementRN == 1;
此处,PDate
是从CSV文件路径中的yyyy / MM / dd推断出的虚拟列(等于MeasurementTime的日期部分)。
现在,由于我们在窗口函数的PDate
部分使用PARTITION BY
,我预计此操作可以并行化,因为我们不必考虑不同的日期(分区)当试图找到任何给定的SensorID和MeasurementTime的最新记录时。不幸的是,看起来似乎不是这样,查看工作图:
在这里,我们从4个不同日期提取数据。每个 Extract 顶点输出完整数量的记录,只将最新记录的任务留给底部的 Combine 顶点,表明{{1}并且后续过滤不会并行发生。
ROW_NUMBER
答案 0 :(得分:1)
我设法找到了一个可用的解决方案,其中我封装了U-SQL,它检测U-SQL存储过程中的最新测量值,该过程采用与pdate
对应的值作为输入参数。
然后,我只是多次执行这个存储过程,并列出了我想并行处理的日期:
DetectLatestMeasurements(20170910);
DetectLatestMeasurements(20170911);
DetectLatestMeasurements(20170912);
DetectLatestMeasurements(20170913);
存储的proc处理一天数据的EXTRACT,转换和OUTPUT,这样就可以完成工作,并且按照我期望的方式进行并行处理。