我从传感器网络获取了大量原始数据,不同的形状代表不同的事件。 我认为Google Bigquery是处理来自传感器的大量数据的好方法。但我不知道如何找到匹配的形状。
这是一个例子:红色方形作为形状模板。我喜欢使用此模板来查找给定数据集中的所有类似形状。 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:为了保存存储空间,传感器只保存与上次保存的数据不同的数据。
答案 0 :(得分:1)
准备好一些魔法?这不是我写过的最清晰的查询,但似乎有效。
所以我正在寻找这种形状:
我将使用查询构建等效项:
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中完成它?
如果您共享一些数据,我可以尝试编写查询。