用于曲线形状匹配的Bigquery

时间:2014-02-11 16:16:05

标签: pattern-matching google-bigquery

我从传感器网络获取了大量原始数据,不同的形状代表不同的事件。 我认为Google Bigquery是处理来自传感器的大量数据的好方法。但我不知道如何找到匹配的形状。sensor data

这是一个例子:红色方形作为形状模板。我喜欢使用此模板来查找给定数据集中的所有类似形状。 Bigquery的corr()应该是解决方案,但需要修复比较窗口。

Oracle的SQL模式匹配(http://docs.oracle.com/cd/E16655_01/server.121/e17749/pattern.htm#DWHSG8956)更接近我想要的但我仍然希望继续使用Bigquery来与GAE和其他Googler服务集成。

有谁知道如何处理这种情况?非常感谢。

============= 来自传感器的原始数据: (https://drive.google.com/file/d/0B1wRJCgCo74uY0N5ZWk4QlVYLVE/edit?usp=sharing

采样率:1Hz; compressed:为了保存存储空间,传感器只保存与上次保存的数据不同的数据。

2 个答案:

答案 0 :(得分:1)

准备好一些魔法?这不是我写过的最清晰的查询,但似乎有效。

所以我正在寻找这种形状:

enter image description here

我将使用查询构建等效项:

SELECT r, x 
FROM  (SELECT 1 r, 90 x),
      (SELECT 2 r, 90 x),
      (SELECT 3 r, 0 x),
      (SELECT 4 r, 10 x),
      (SELECT 5 r, 20 x);

现在,通过单个查询,我将在整个数据集上移动该形状,测量相关性。查询将对所有结果进行排序,并告诉我在哪个时间点我们有5个最接近该形状的连续点:

SELECT CORR(a.x, b.Pressure) corr, d5, COUNT(*) c
FROM (
  SELECT INTEGER(r) r, x FROM 
  (SELECT 1 r, 90 x), (SELECT 2 r, 90 x), (SELECT 3 r, 0 x), (SELECT 4 r, 10 x), (SELECT 5 r, 20 x)
  ) a
JOIN EACH (
  SELECT a.DateTime d0, b.d5 d5, a.Pressure pressure,
    RANK() OVER(PARTITION BY d5 ORDER BY d0) r
  FROM [seventh-helix-483:waterpressure.pressue_1391719236611] a
  CROSS JOIN (
    SELECT DateTime, LEAD(DateTime, 4) OVER(ORDER BY DateTime) d5
    FROM [seventh-helix-483:waterpressure.pressue_1391719236611]) b
  WHERE a.DateTime BETWEEN b.DateTime AND b.d5) b
ON a.r=b.r
GROUP BY d5
HAVING c=5
ORDER BY corr DESC
LIMIT 5

结果如下:

corr                d5                  c    
0.9998464758523021  1/27/2014 21:04:07  5    
0.9980241522460084  1/28/2014 20:25:20  5    
0.9978582480606312  1/27/2014 19:27:36  5    
0.9972145139280599  1/29/2014 23:00:07  5    
0.9961191863441274  1/30/2014 12:11:08  5    

(使用来自https://bigquery.cloud.google.com/table/seventh-helix-483:waterpressure.pressue_1391719236611的数据)

答案 1 :(得分:0)

我喜欢使用CORR()的想法。如何在时间CROSS JOIN中完成它?

如果您共享一些数据,我可以尝试编写查询。