時序資料庫InfluxDB安裝及使用

来源:https://www.cnblogs.com/chinway/archive/2018/11/13/9953322.html
-Advertisement-
Play Games

時序資料庫InfluxDB安裝及使用 1 安裝配置 安裝 常規操作 啟停 2 重要概念 influxdb裡面有一些重要概念:database,timestamp,field key, field value, field set,tag key,tag value,tag set,measureme ...


時序資料庫InfluxDB安裝及使用

 

1 安裝配置

安裝

wget https://dl.influxdata.com/influxdb/releases/influxdb-1.3.1.x86_64.rpm
yum localinstall influxdb-1.3.1.x86_64.rpm

 

常規操作

啟停

systemctl stop influxdb
systemctl status influxdb
systemctl start influxdb

 

2 重要概念

influxdb裡面有一些重要概念:database,timestamp,field key, field value, field set,tag key,tag value,tag set,measurement, retention policy ,series,point。結合下麵的例子數據來說明這幾個概念:

name: census
-————————————-————————————-————————————
time                                 butterflies     honeybees     location      scientist
2015-08-18T00:00:00Z      12                    23                  1            langstroth
2015-08-18T00:00:00Z      1                      30                  1            perpetua
2015-08-18T00:06:00Z      11                    28                  1            langstroth
2015-08-18T00:06:00Z      3                      28                  1            perpetua
2015-08-18T05:54:00Z      2                      11                  2            langstroth
2015-08-18T06:00:00Z      1                      10                  2            langstroth
2015-08-18T06:06:00Z      8                      23                  2            perpetua
2015-08-18T06:12:00Z      7                      22                  2            perpetua

 

timestamp

既然是時間序列資料庫,influxdb的數據都有一列名為time的列,裡面存儲UTC時間戳。

field key,field value,field set

butterflies和honeybees兩列數據稱為欄位(fields),influxdb的欄位由field key和field value組成。其中butterflies和honeybees為field key,它們為string類型,用於存儲元數據。

而butterflies這一列的數據12-7為butterflies的field value,同理,honeybees這一列的23-22為honeybees的field value。field value可以為string,float,integer或boolean類型。field value通常都是與時間關聯的。

field key和field value對組成的集合稱之為field set。如下:

butterflies = 12 honeybees = 23
butterflies = 1 honeybees = 30
butterflies = 11 honeybees = 28
butterflies = 3 honeybees = 28
butterflies = 2 honeybees = 11
butterflies = 1 honeybees = 10
butterflies = 8 honeybees = 23
butterflies = 7 honeybees = 22

 

在influxdb中,欄位必須存在。註意,欄位是沒有索引的。如果使用欄位作為查詢條件,會掃描符合查詢條件的所有欄位值,性能不及tag。類比一下,fields相當於SQL的沒有索引的列。

tag key,tag value,tag set

location和scientist這兩列稱為標簽(tags),標簽由tag key和tag value組成。location這個tag key有兩個tag value:1和2,scientist有兩個tag value:langstroth和perpetua。tag key和tag value對組成了tag set,示例中的tag set如下:

location = 1, scientist = langstroth
location = 2, scientist = langstroth
location = 1, scientist = perpetua
location = 2, scientist = perpetua

 

tags是可選的,但是強烈建議你用上它,因為tag是有索引的,tags相當於SQL中的有索引的列。tag value只能是string類型 如果你的常用場景是根據butterflies和honeybees來查詢,那麼你可以將這兩個列設置為tag,而其他兩列設置為field,tag和field依據具體查詢需求來定。

measurement

measurement是fields,tags以及time列的容器,measurement的名字用於描述存儲在其中的欄位數據,類似mysql的表名。如上面例子中的measurement為census。measurement相當於SQL中的表,本文中我在部分地方會用表來指代measurement。

retention policy

retention policy指數據保留策略,示例數據中的retention policy為預設的autogen。它表示數據一直保留永不過期,副本數量為1。你也可以指定數據的保留時間,如30天。

series

series是共用同一個retention policy,measurement以及tag set的數據集合。示例中數據有4個series,如下:

Arbitrary series numberRetention policyMeasurementTag set
series 1 autogen census location = 1,scientist = langstroth
series 2 autogen census location = 2,scientist = langstroth
series 3 autogen census location = 1,scientist = perpetua
series 4 autogen census location = 2,scientist = perpetua

point

point則是同一個series中具有相同時間的field set,points相當於SQL中的數據行。如下麵就是一個point:

name: census
-----------------
time                              butterflies    honeybees   location    scientist
2015-08-18T00:00:00Z       1                    30           1            perpetua

database

上面提到的結構都存儲在資料庫中,示例的資料庫為my_database。一個資料庫可以有多個measurement,retention policy, continuous queries以及user。influxdb是一個無模式的資料庫,可以很容易的添加新的measurement,tags,fields等。而它的操作卻和傳統的資料庫一樣,可以使用類SQL語言查詢和修改數據。

influxdb不是一個完整的CRUD資料庫,它更像是一個CR-ud資料庫。它優先考慮的是增加和讀取數據而不是更新和刪除數據的性能,而且它阻止了某些更新和刪除行為使得創建和讀取數據更加高效。

3 特色函數

influxdb函數分為聚合函數,選擇函數,轉換函數,預測函數等。除了與普通資料庫一樣提供了基本操作函數外,還提供了一些特色函數以方便數據統計計算,下麵會一一介紹其中一些常用的特色函數。

  • 聚合函數:FILL()INTEGRAL()SPREAD(), STDDEV()MEAN()MEDIAN()等。

  • 選擇函數: SAMPLE()PERCENTILE()FIRST()LAST()TOP()BOTTOM()等。

  • 轉換函數: DERIVATIVE()DIFFERENCE()等。

  • 預測函數:HOLT_WINTERS()

先從官網導入測試數據(註:這裡測試用的版本是1.3.1,最新版本是1.3.5):

$ curl https://s3.amazonaws.com/noaa.water-database/NOAA_data.txt -o NOAA_data.txt
$ influx -import -path=NOAA_data.txt -precision=s -database=NOAA_water_database
$ influx -precision rfc3339 -database NOAA_water_database
Connected to http://localhost:8086 version 1.3.1InfluxDB shell 1.3.1
> show measurements
name: measurements
name
----
average_temperature
distincts
h2o_feet
h2o_pH
h2o_quality
h2o_temperature

> show series from h2o_feet;
key
---
h2o_feet,location=coyote_creek
h2o_feet,location=santa_monica

下麵的例子都以官方示例資料庫來測試,這裡只用部分數據以方便觀察。measurement為h2o_feet,tag key為location,field key有level descriptionwater_level兩個。

> SELECT * FROM "h2o_feet" WHERE time >= '2015-08-17T23:48:00Z' AND time <= '2015-08-18T00:30:00Z'name: h2o_feet
time                     level description                               location                         water_level
----                     -----------------                                --------                         -----------
2015-08-18T00:00:00Z      between 6 and 9 feet                           coyote_creek                     8.12
2015-08-18T00:00:00Z      below 3 feet                      santa_monica             2.064
2015-08-18T00:06:00Z      between 6 and 9 feet                           coyote_creek                      8.005
2015-08-18T00:06:00Z      below 3 feet                                     santa_monica                     2.116
2015-08-18T00:12:00Z     between 6 and 9 feet                              coyote_creek                      7.887
2015-08-18T00:12:00Z     below 3 feet                                      santa_monica                     2.028
2015-08-18T00:18:00Z     between 6 and 9 feet                              coyote_creek                     7.762
2015-08-18T00:18:00Z     below 3 feet                                       santa_monica                    2.126
2015-08-18T00:24:00Z     between 6 and 9 feet                               coyote_creek                    7.635
2015-08-18T00:24:00Z     below 3 feet                                       santa_monica                    2.041
2015-08-18T00:30:00Z     between 6 and 9 feet                               coyote_creek                     7.5
2015-08-18T00:30:00Z     below 3 feet                                       santa_monica                     2.051

 

GROUP BY,FILL()

如下語句中GROUP BY time(12m),* 表示以每12分鐘和tag(location)分組(如果是GROUP BY time(12m)則表示僅每12分鐘分組,GROUP BY 參數只能是time和tag)。然後fill(200)表示如果這個時間段沒有數據,以200填充,mean(field_key)求該範圍內數據的平均值(註意:這是依據series來計算。其他還有SUM求和,MEDIAN求中位數)。LIMIT 7表示限制返回的point(記錄數)最多為7條,而SLIMIT 1則是限制返回的series為1個。

註意這裡的時間區間,起始時間為整點前包含這個區間第一個12m的時間,比如這裡為 2015-08-17T:23:48:00Z,第一條為 2015-08-17T23:48:00Z <= t < 2015-08-18T00:00:00Z這個區間的location=coyote_creekwater_level的平均值,這裡沒有數據,於是填充的200。第二條為 2015-08-18T00:00:00Z <= t < 2015-08-18T00:12:00Z區間的location=coyote_creekwater_level平均值,這裡為 (8.12+8.005)/ 2 = 8.0625,其他以此類推。

GROUP BY time(10m)則表示以10分鐘分組,起始時間為包含這個區間的第一個10m的時間,即 2015-08-17T23:40:00Z。預設返回的是第一個series,如果要計算另外那個series,可以在SQL語句後面加上 SOFFSET 1

那如果時間小於數據本身採集的時間間隔呢,比如GROUP BY time(10s)呢?這樣的話,就會按10s取一個點,沒有數值的為空或者FILL填充,對應時間點有數據則保持不變。

## GROUP BY time(12m)
> SELECT mean("water_level") FROM "h2o_feet" WHERE time >= '2015-08-17T23:48:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),* fill(200) LIMIT 7 SLIMIT 1name: h2o_feet
tags: location=coyote_creek
time                 mean
----                 ----
2015-08-17T23:48:00Z 200
2015-08-18T00:00:00Z 8.0625
2015-08-18T00:12:00Z 7.8245
2015-08-18T00:24:00Z 7.5675## GROUP BY time(10m),SOFFSET設置為1
> SELECT mean("water_level") FROM "h2o_feet" WHERE time >= '2015-08-17T23:48:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(10m),* fill(200) LIMIT 7 SLIMIT 1 SOFFSET 1name: h2o_feet
tags: location=santa_monica
time                             mean
----                             ----
2015-08-17T23:40:00Z             200
2015-08-17T23:50:00Z             200
2015-08-18T00:00:00Z             2.09
2015-08-18T00:10:00Z             2.077
2015-08-18T00:20:00Z             2.041
2015-08-18T00:30:00Z             2.051

 

INTEGRAL(field_key, unit)

計算數值欄位值覆蓋的曲面的面積值並得到面積之和。測試數據如下:

> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'name: h2o_feet
time                           water_level
----                           -----------
2015-08-18T00:00:00Z           2.064
2015-08-18T00:06:00Z           2.116
2015-08-18T00:12:00Z           2.028
2015-08-18T00:18:00Z           2.126
2015-08-18T00:24:00Z           2.041
2015-08-18T00:30:00Z           2.051

使用INTERGRAL計算面積。註意,這個面積就是這些點連接起來後與時間圍成的不規則圖形的面積,註意unit預設是以1秒計算,所以下麵語句計算結果為3732.66=2.028*1800+分割出來的梯形和三角形面積。如果unit改為1分,則結果為3732.66/60 = 62.211。unit為2分,則結果為3732.66/120 = 31.1055。以此類推。

# unit為預設的1秒
> SELECT INTEGRAL("water_level") FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'name: h2o_feet
time                           integral
----                           --------
1970-01-01T00:00:00Z         3732.66# unit為1分
> SELECT INTEGRAL("water_level", 1m) FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'name: h2o_feet
time                          integral
----                          --------
1970-01-01T00:00:00Z         62.211

SPREAD(field_key)

計算數值欄位的最大值和最小值的差值。

> SELECT SPREAD("water_level") FROM "h2o_feet" WHERE time >= '2015-08-17T23:48:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),* fill(18) LIMIT 3 SLIMIT 1 SOFFSET 1
name: h2o_feet
tags: location=santa_monica
time                              spread
----                              ------
2015-08-17T23:48:00Z            18
2015-08-18T00:00:00Z             0.052000000000000046
2015-08-18T00:12:00Z             0.09799999999999986

 

STDDEV(field_key)

計算欄位的標準差。influxdb用的是貝塞爾修正的標準差計算公式 ,如下:

  • mean=(v1+v2+...+vn)/n;

  • stddev = math.sqrt(
    ((v1-mean)2 + (v2-mean)2 + ...+(vn-mean)2)/(n-1)
    )

> SELECT STDDEV("water_level") FROM "h2o_feet" WHERE time >= '2015-08-17T23:48:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),* fill(18) SLIMIT 1;
name: h2o_feet
tags: location=coyote_creek
time                          stddev
----                          ------
2015-08-17T23:48:00Z         18
2015-08-18T00:00:00Z         0.08131727983645186
2015-08-18T00:12:00Z         0.08838834764831845
2015-08-18T00:24:00Z         0.09545941546018377

PERCENTILE(field_key, N)

選取某個欄位中大於N%的這個欄位值。

如果一共有4條記錄,N為10,則10%*4=0.4,四捨五入為0,則查詢結果為空。N為20,則 20% * 4 = 0.8,四捨五入為1,選取的是4個數中最小的數。如果N為40,40% * 4 = 1.6,四捨五入為2,則選取的是4個數中第二小的數。由此可以看出N=100時,就跟MAX(field_key)是一樣的,而當N=50時,與MEDIAN(field_key)在欄位值為奇數個時是一樣的。

> SELECT PERCENTILE("water_level",20) FROM "h2o_feet" WHERE time >= '2015-08-17T23:48:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m)
name: h2o_feet
time                         percentile
----                         ----------
2015-08-17T23:48:00Z 
2015-08-18T00:00:00Z         2.064
2015-08-18T00:12:00Z         2.028
2015-08-18T00:24:00Z         2.041
> SELECT PERCENTILE("water_level",40) FROM "h2o_feet" WHERE time >= '2015-08-17T23:48:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m)
name: h2o_feet
time                               percentile
----                               ----------
2015-08-17T23:48:00Z 
2015-08-18T00:00:00Z         2.1162015-08-18T00:12:00Z 2.126
2015-08-18T00:24:00Z         2.051

SAMPLE(field_key, N)

隨機返回field key的N個值。如果語句中有GROUP BY time(),則每組數據隨機返回N個值。

> SELECT SAMPLE("water_level",2) FROM "h2o_feet" WHERE time >= '2015-08-17T23:48:00Z' AND time <= '2015-08-18T00:30:00Z';
name: h2o_feet
time                         sample
----                         ------
2015-08-18T00:00:00Z         2.064
2015-08-18T00:12:00Z         2.028
> SELECT SAMPLE("water_level",2) FROM "h2o_feet" WHERE time >= '2015-08-17T23:48:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m);
name: h2o_feet
time                         sample
----                         ------
2015-08-18T00:06:00Z         2.116
2015-08-18T00:06:00Z         8.005
2015-08-18T00:12:00Z         7.887
2015-08-18T00:18:00Z         7.762
2015-08-18T00:24:00Z         7.635
2015-08-18T00:30:00Z         2.051

CUMULATIVE_SUM(field_key)

計算欄位值的遞增和。

> SELECT CUMULATIVE_SUM("water_level") FROM "h2o_feet" WHERE time >= '2015-08-17T23:48:00Z' AND time <= '2015-08-18T00:30:00Z';
name: h2o_feet
time                                     cumulative_sum
----                                     --------------
2015-08-18T00:00:00Z                      8.12
2015-08-18T00:00:00Z                      10.184
2015-08-18T00:06:00Z                      18.189
2015-08-18T00:06:00Z                      20.305
2015-08-18T00:12:00Z                      28.192
2015-08-18T00:12:00Z                      30.22
2015-08-18T00:18:00Z                      37.982
2015-08-18T00:18:00Z                      40.108
2015-08-18T00:24:00Z                      47.742999999999995
2015-08-18T00:24:00Z                      49.78399999999999
2015-08-18T00:30:00Z                      57.28399999999999
2015-08-18T00:30:00Z                      59.334999999999994

DERIVATIVE(field_key, unit) 和 NON_NEGATIVE_DERIVATIVE(field_key, unit)

計算欄位值的變化比。unit預設為1s,即計算的是1秒內的變化比。

如下麵的第一個數據計算方法是 (2.116-2.064)/(6*60) = 0.00014..,其他計算方式同理。雖然原始數據是6m收集一次,但是這裡的變化比預設是按秒來計算的。如果要按6m計算,則設置unit為6m即可。

> SELECT DERIVATIVE("water_level") FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'name: h2o_feet
time                                      derivative
----                                       ----------
2015-08-18T00:06:00Z                     0.00014444444444444457
2015-08-18T00:12:00Z                     -0.00024444444444444465
2015-08-18T00:18:00Z                     0.0002722222222222218
2015-08-18T00:24:00Z                     -0.000236111111111111
2015-08-18T00:30:00Z                     0.00002777777777777842
> SELECT DERIVATIVE("water_level", 6m) FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'name: h2o_feet
time                                       derivative
----                                       ----------
2015-08-18T00:06:00Z                     0.052000000000000046
2015-08-18T00:12:00Z                     -0.08800000000000008
2015-08-18T00:18:00Z                     0.09799999999999986
2015-08-18T00:24:00Z                     -0.08499999999999996
2015-08-18T00:30:00Z                     0.010000000000000231

 

而DERIVATIVE結合GROUP BY time,以及mean可以構造更加複雜的查詢,如下所示:

> SELECT DERIVATIVE(mean("water_level"), 6m) FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' group by time(12m), *
name: h2o_feet
tags: location=coyote_creek
time                                derivative
----                                ----------
2015-08-18T00:12:00Z             -0.11900000000000022
2015-08-18T00:24:00Z             -0.12849999999999984name: h2o_feet
tags: location=santa_monica
time                               derivative
----                               ----------
2015-08-18T00:12:00Z             -0.00649999999999995
2015-08-18T00:24:00Z             -0.015499999999999847

這個計算其實是先根據GROUP BY time求平均值,然後對這個平均值再做變化比的計算。因為數據是按12分鐘分組的,而變化比的unit是6分鐘,所以差值除以2(12/6)才得到變化比。如第一個值是 (7.8245-8.0625)/2 = -0.1190

> SELECT mean("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' group by time(12m), *
name: h2o_feet
tags: location=coyote_creek
time                                   mean
----                                   ----
2015-08-18T00:00:00Z                  8.0625
2015-08-18T00:12:00Z                  7.8245
2015-08-18T00:24:00Z                  7.5675name: h2o_feet
tags: location=santa_monica
time                                    mean
----                                    ----
2015-08-18T00:00:00Z                    2.09
2015-08-18T00:12:00Z                    2.077
2015-08-18T00:24:00Z                    2.0460000000000003

NON_NEGATIVE_DERIVATIVEDERIVATIVE不同的是它只返回的是非負的變化比:

> SELECT DERIVATIVE(mean("water_level"), 6m) FROM "h2o_feet" WHERE location='santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' group by time(6m), *
name: h2o_feet
tags: location=santa_monica
time                                       derivative
----                                       ----------
2015-08-18T00:06:00Z                     0.052000000000000046
2015-08-18T00:12:00Z                     -0.08800000000000008
2015-08-18T00:18:00Z                     0.09799999999999986
2015-08-18T00:24:00Z                     -0.08499999999999996
2015-08-18T00:30:00Z                     0.010000000000000231
> SELECT NON_NEGATIVE_DERIVATIVE(mean("water_level"), 6m) FROM "h2o_feet" WHERE location='santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' group by time(6m), *
name: h2o_feet
tags: location=santa_monica
time                                      non_negative_derivative
----                                      -----------------------
2015-08-18T00:06:00Z                     0.052000000000000046
2015-08-18T00:18:00Z                     0.09799999999999986
2015-08-18T00:30:00Z                     0.010000000000000231

4 連續查詢

4.1 基本語法

連續查詢(CONTINUOUS QUERY,簡寫為CQ)是指定時自動在實時數據上進行的InfluxQL查詢,查詢結果可以存儲到指定的measurement中。基本語法格式如下:

CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
BEGIN  
    <cq_query>
END

cq_query格式: SELECT <function[s]> INTO <destination_measurement> FROM <measurement> [WHERE <stuff>] GROUP BY time(<interval>)[,<tag_key[s]>]

 

CQ操作的是實時數據,它使用本地伺服器的時間戳、GROUP BY time()時間間隔以及InfluxDB預先設置好的時間範圍來確定什麼時候開始查詢以及查詢覆蓋的時間範圍。註意CQ語句裡面的WHERE條件是沒有時間範圍的,因為CQ會根據GROUP BY time()自動確定時間範圍。

CQ執行的時間間隔和GROUP BY time()的時間間隔一樣,它在InfluxDB預先設置的時間範圍的起始時刻執行。如果GROUP BY time(1h),則單次查詢的時間範圍為 now()-GROUP BY time(1h)到 now(),也就是說,如果當前時間為17點,這次查詢的時間範圍為 16:00到16:59.99999。

下麵看幾個示例,示例數據如下,這是資料庫transportation中名為bus_data的measurement,每15分鐘統計一次乘客數和投訴數。數據文件bus_data.txt如下:

# DDLCREATE DATABASE transportation
# DML
# CONTEXT-DATABASE: transportation bus_data,complaints=9 passengers=5 1472367600
bus_data,complaints=9 passengers=8 1472368500
bus_data,complaints=9 passengers=8 1472369400
bus_data,complaints=9 passengers=7 1472370300
bus_data,complaints=9 passengers=8 1472371200
bus_data,complaints=7 passengers=15 1472372100
bus_data,complaints=7 passengers=15 1472373000
bus_data,complaints=7 passengers=17 1472373900
bus_data,complaints=7 passengers=20 1472374800

導入數據,命令如下:

root@f216e9be15bf:/# influx -import -path=bus_data.txt -precision=s
root@f216e9be15bf:/# influx -precision=rfc3339 -database=transportation
Connected to http://localhost:8086 version 1.3.5InfluxDB shell version: 1.3.5
> select * from bus_data
name: bus_data
time                              complaints           passengers
----                               ----------             ----------
2016-08-28T07:00:00Z                 9                      5
2016-08-28T07:15:00Z                 9                      8
2016-08-28T07:30:00Z                 9                      8
2016-08-28T07:45:00Z                 9                      7
2016-08-28T08:00:00Z                 9                      8
2016-08-28T08:15:00Z                 7                      15
2016-08-28T08:30:00Z                 7                      15
2016-08-28T08:45:00Z                 7                      17
2016-08-28T09:00:00Z                 7                      20

示例1 自動縮小取樣存儲到新的measurement中

對單個欄位自動縮小取樣並存儲到新的measurement中。

CREATE CONTINUOUS QUERY "cq_basic" ON "transportation"
BEGIN
  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h)
END

這個CQ的意思就是對bus_data每小時自動計算取樣數據的平均乘客數並存儲到 average_passengers中。那麼在2016-08-28這天早上會執行如下流程:

At 8:00 cq_basic 執行查詢,查詢時間範圍 time >= '7:00' AND time < '08:00'.
cq_basic寫入一條記錄到 average_passengers:
name: average_passengers
------------------------
time                       mean
2016-08-28T07:00:00Z       7
At 9:00 cq_basic 執行查詢,查詢時間範圍 time >= '8:00' AND time < '9:00'.
cq_basic寫入一條記錄到 average_passengers:
name: average_passengers
------------------------
time                           mean
2016-08-28T08:00:00Z           13.75
# Results
> SELECT * FROM "average_passengers"name: average_passengers
------------------------
time                      mean
2016-08-28T07:00:00Z       7
2016-08-28T08:00:00Z       13.75

示例2 自動縮小取樣並存儲到新的保留策略(Retention Policy)中

CREATE CONTINUOUS QUERY "cq_basic_rp" ON "transportation"
BEGIN
  SELECT mean("passengers") INTO "transportation"."three_weeks"."average_passengers" FROM "bus_data" GROUP BY time(1h)
END

與示例1類似,不同的是保留的策略不是autogen,而是改成了three_weeks(創建保留策略語法 CREATE RETENTION POLICY "three_weeks" ON "transportation" DURATION 3w REPLICATION 1)。

> SELECT * FROM "transportation"."three_weeks"."average_passengers"name: average_passengers
------------------------
time                       mean
2016-08-28T07:00:00Z       7
2016-08-28T08:00:00Z       13.75

示例3 使用後向引用(backreferencing)自動縮小取樣並存儲到新的資料庫中

CREATE CONTINUOUS QUERY "cq_basic_br" ON "transportation"
BEGIN
  SELECT mean(*) INTO "downsampled_transportation"."autogen".:MEASUREMENT FROM /.*/ GROUP BY time(30m),*
END

使用後向引用語法自動縮小取樣並存儲到新的資料庫中。語法 :MEASUREMENT 用來指代後面的表,而 /.*/則是分別查詢所有的表。這句CQ的含義就是每30分鐘自動查詢transportation的所有表(這裡只有bus_data一個表),並將30分鐘內數字欄位(passengers和complaints)求平均值存儲到新的資料庫 downsampled_transportation中。

最終結果如下:

> SELECT * FROM "downsampled_transportation."autogen"."bus_data"name: bus_data
--------------
time                               mean_complaints                    mean_passengers
2016-08-28T07:00:00Z               9                                         6.5
2016-08-28T07:30:00Z               9                                         7.5
2016-08-28T08:00:00Z               8                                         11.5
2016-08-28T08:30:00Z               7                                         16

示例4 自動縮小取樣以及配置CQ的時間範圍

CREATE CONTINUOUS QUERY "cq_basic_offset" ON "transportation"
BEGIN
  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h,15m)
END

與前面幾個示例不同的是,這裡的GROUP BY time(1h, 15m)指定了一個時間偏移,也就是說 cq_basic_offset執行的時間不再是整點,而是往後偏移15分鐘。執行流程如下:

At 8:15 cq_basic_offset 執行查詢的時間範圍 time >= '7:15' AND time < '8:15'.
name: average_passengers
------------------------
time                      mean
2016-08-28T07:15:00Z       7.75
At 9:15 cq_basic_offset 執行查詢的時間範圍 time >= '8:15' AND time < '9:15'.
name: average_passengers
------------------------
time                   mean
2016-08-28T08:15:00Z   16.75

最終結果:

> SELECT * FROM "average_passengers"name: average_passengers
------------------------
time                                   mean
2016-08-28T07:15:00Z       7.75
2016-08-28T08:15:00Z       16.75

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 解決方法: 1.進入啟動文件目錄 2.將用戶加入到docker 組 sudo gpasswd -a ${USER} docker 3.使用root用戶 sudo su 4. 切換當前用戶 su ${USER} 5,.重新啟動docker鏡像 docker-compose up -d ...
  • Lab 5: File system, Spawn and Shell tags: mit 6.828 os 概述 本lab將實現JOS的文件系統,只要包括如下四部分: 1. 引入一個 文件系統進程(FS進程) 的特殊進程,該進程提供文件操作的介面。 2. 建立RPC機制 ,客戶端進程向FS進程發送 ...
  • 切換到安裝node的位置 此處為/usr/local/lib/nodejs不存在可以建立 3. 下載 4. 解壓 5. 配置環境變數 輸入如下內容 6. 立即刷新環境變數 7. 檢測版本 8.建立系統的鏈接,簡化調用 ...
  • redis管道 1.redis管道介紹 redis採用的是CS架構,客戶端與伺服器端通過tcp協議進行連接通信,因此無論是發出請求還是接收響應,都必須經過網路傳輸。在tcp連接過程中,客戶端和伺服器端是通過阻塞式的一問一答方式進行通信的,即客戶端必須接收到服務端完整的響應,才能進行後續請求。 有時我 ...
  • oracle7大服務 成功安裝Oracle 11g後,共有7個服務: 1、Oracle ORCL VSS Writer Service:Oracle捲映射拷貝寫入服務,VSS(Volume Shadow Copy Service)能夠讓存儲基礎設備(比如磁碟,陣列等)創建高保真的時間點映像,即映射拷 ...
  • 1)停止MySQL服務 打開控制面板→管理工具→服務(找到MySQL) 2)卸掉mysql server 打開控制面板→程式與功能→找到mysql server然後卸載 3)將mysql目錄下的安裝文件夾刪除,例如我的:C:\Program Files (x86)\MySQL 4)刪除mysql在註 ...
  • 創建聚簇表過程: 創建簇(cluster) 創建簇表(基本類似創建一般表但有區別) 創建簇索引(index) 數據管理 創建簇: create cluster stu_ach(sid number) pctused 40 當數據少於40%,可以被insert,一般預設值為40% pcfree 10 ...
  • 一.概述 在前面章節中,主要瞭解了 Redis用到的主要數據結構,包括:簡單動態字元串、鏈表(雙端鏈表)、字典、跳躍表、 整數集合、壓縮列表(後面再瞭解)。Redis沒有直接使用這些數據結構來實現鍵值對資料庫,而是基於這些數據結構創建一個對象系統,這個系統對象包括:字元串對象、列表對象、哈希對象(散 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...