Apache IoTDBチュートリアルシリーズ2:基本的なSQL操作

今日は、メタデータとデータの追加、削除、変更、チェックなど、一般的に使用されるSQLを主に紹介します。この記事のSQLは0.10.0に基づいています。このメジャーバージョンは間もなくリリースされます!

本文は11018語(ほとんどがSQLと印刷された情報で、中国語の文字は多くありません)であり、推定読み取り時間は10分です。

現在、IoTDBにはSQLとNoSQLの2つの主要なインターフェースがあります。本日はSQLインターフェースを紹介します。理解を容易にするために、以下のリンクから0.10.0プレリリースバージョンをダウンロードして、視聴しながら試してみることができます。

バイナリバージョンのダウンロードリンク:

https://pan.baidu.com/s/1KWnEIIE0Duwr9TZVugib6w  

パスワード:dmrg

ソースコードをコンパイルすることもできます:

git clone https://github.com/apache/incubator-iotdb.git
cd incubator-iotdb
git fetch origin rel/0.10:rel/0.10
git checkout rel/0.10
mvn clean package -pl distribution -am -DskipTests
二进制发布包位置:
distribution/target/apache-iotdb-0.10.0-SNAPSHOT-incubating-bin.zip

さあ、始めましょう!

DDLデータ定義言語

参照文書:

http://iotdb.apache.org/UserGuide/Master/Operation%20Manual/DDL%20Data%20Definition%20Language.html

ストレージグループの操作

# 创建存储组
IoTDB> set storage group to root.turbine


# 查询存储组
IoTDB> SHOW STORAGE GROUP
+-------------+
|storage group|
+-------------+
| root.turbine|
+-------------+


# 删除存储组
IoTDB> delete storage group root.turbine

時系列を作成する

create timeseries root.turbine.d1.s1(temperature1) with datatype=FLOAT, encoding=GORILLA, compression=SNAPPY tags(unit=degree, owner=user1) attributes(description=mysensor1, location=BeiJing)
create timeseries root.turbine.d1.s2(temperature2) with datatype=FLOAT, encoding=GORILLA, compression=SNAPPY tags(unit=degree, owner=user1) attributes(description=mysensor2, location=TianJin)
create timeseries root.turbine.d2.s1(temperature1) with datatype=FLOAT, encoding=GORILLA, compression=SNAPPY tags(unit=degree, owner=user2) attributes(description=mysensor3, location=HeBei)

上に登録されたシーケンス可視化は下の画像です(手描き...現在、可視化機能はありません)

時系列のパスやコードなどの基本的な情報に加えて、実用的なアプリケーションでより使いやすくするために、測定点のエイリアス、ラベル、属性の3つの概念を追加しました。タグと属性の合計サイズは、構成ファイルtag_attribute_total_sizeで設定されます。

エイリアス:計測点のエイリアス。計測点の名前のように、設定せずに読み書きに使用できます。

ラベル:key = valueの形式で、時系列メタデータは、ラベル(ユニットや所有者など)を介して後方に照会できます。ラベルはメモリに常駐します。現在、指定できるタグクエリ条件は1つだけです。これは、正確であいまいなクエリにすることができます。

属性:key = value形式。これは、時系列パスに従って、説明情報や場所などの属性情報のみを表示できます。逆クエリの必要がない場合は、属性として定義することをお勧めします。

# 插入更新 别名、标签、属性
ALTER timeseries root.turbine.d1.s1 UPSERT ALIAS=newAlias TAGS(unit=Degree, owner=me) ATTRIBUTES(description=ha, newAttr=v1)
# 删除时间序列
delete timeseries root.turbine.d2.s1

パスとラベルに基づいてシーケンスメタデータをクエリする

# 查询所有时间序列数据
IoTDB> show timeseries
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+
|        timeseries|       alias|storage group|dataType|encoding|compression|description|location|owner|  unit|
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+
|root.turbine.d1.s1|temperature1| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor1| BeiJing|user1|degree|
|root.turbine.d1.s2|temperature2| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor2| TianJin|user1|degree|
|root.turbine.d2.s1|temperature1| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor3|   HeBei|user2|degree|
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+


# 查询 root.turbine.d1 前缀路径下的时间序列 
# 根据 tag 精确查询 owner 为 user1 的序列
IoTDB> show timeseries root.turbine.d1
IoTDB> show timeseries root.turbine where owner=user1
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+
|        timeseries|       alias|storage group|dataType|encoding|compression|description|location|owner|  unit|
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+
|root.turbine.d1.s1|temperature1| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor1| BeiJing|user1|degree|
|root.turbine.d1.s2|temperature2| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor2| TianJin|user1|degree|
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+


# 根据 tag 模糊查询 owner 的 value 中包含 'user' 的序列
IoTDB> show timeseries where owner contains 'user'
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+
|        timeseries|       alias|storage group|dataType|encoding|compression|description|location|owner|  unit|
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+
|root.turbine.d1.s1|temperature1| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor1| BeiJing|user1|degree|
|root.turbine.d1.s2|temperature2| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor2| TianJin|user1|degree|
|root.turbine.d2.s1|temperature1| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor3|   HeBei|user2|degree|
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+

パスの子ノードを表示する

IoTDB> show child paths root.turbine
+---------------+
|    child paths|
+---------------+
|root.turbine.d1|
|root.turbine.d2|
+---------------+


時系列の数を数える

# 统计所有时间序列数量
IoTDB> count timeseries
+-----+
|count|
+-----+
|    3|
+-----+


# 分组统计时间序列,root 为第 0 层
IoTDB> count timeseries group by level=2
+---------------+-----+
|         column|count|
+---------------+-----+
|root.turbine.d1|    2|
|root.turbine.d2|    1|
+---------------+-----+

すべてのデバイスをクエリ

つまり、最後から2番目のノードのパスを照会します

IoTDB> show devices
+---------------+
|        devices|
+---------------+
|root.turbine.d1|
|root.turbine.d2|
+---------------+

DMLデータ操作言語

参照文書:

http://iotdb.apache.org/UserGuide/Master/Operation%20Manual/DML%20Data%20Manipulation%20Language.html

データ書き込み

1つのデバイス、1つのタイムスタンプ、および複数の測定ポイントの値を一度に書き込むことができます。

insert into root.turbine.d1(timestamp,s1,s2) values(1,1,2);
insert into root.turbine.d1(timestamp,s1,s2) values(2,1,2);
insert into root.turbine.d1(timestamp,s1,s2) values(3,1,2);
insert into root.turbine.d1(timestamp,s1,s2) values(4,1,2);
insert into root.turbine.d1(timestamp,s1,s2) values(5,1,2);
insert into root.turbine.d1(timestamp,s1,s2) values(6,1,2);
insert into root.turbine.d1(timestamp,s1,s2) values(10,1,2);

データ削除

現在、特定の時点より前のデータの削除のみがサポートされており、任意の期間のデータの削除がサポートされます。

delete from root.turbine.d2.s1 where time <= 10

生データクエリ

次はさまざまなクエリですが、最も一般的に使用されるのは生データクエリです。

IoTDB> select s1, s2 from root.turbine.d1
+-----------------------------+------------------+------------------+
|                         Time|root.turbine.d1.s1|root.turbine.d1.s2|
+-----------------------------+------------------+------------------+
|1970-01-01T08:00:00.001+08:00|               1.0|               2.0|
|1970-01-01T08:00:00.002+08:00|               1.0|               2.0|
|1970-01-01T08:00:00.003+08:00|               1.0|               2.0|
|1970-01-01T08:00:00.004+08:00|               1.0|               2.0|
|1970-01-01T08:00:00.005+08:00|               1.0|               2.0|
|1970-01-01T08:00:00.006+08:00|               1.0|               2.0|
|1970-01-01T08:00:00.010+08:00|               1.0|               2.0|
+-----------------------------+------------------+------------------+

シングルポイントフィルnull値クエリ

センサーによって収集されたデータの多くのタイムスタンプには偏差があり、正確なタイムスタンプクエリでデータを簡単に見つけることができます。以前の方法または線形の方法を使用して、空白の値を入力できます。

IoTDB> select s1 from root.turbine.d1 where time = 8
+----+------------------+
|Time|root.turbine.d1.s1|
+----+------------------+
+----+------------------+


# 用前边最近的值填过来
IoTDB> select s1 from root.turbine.d1 where time = 8 fill(float[previous])
+-----------------------------+------------------+
|                         Time|root.turbine.d1.s1|
+-----------------------------+------------------+
|1970-01-01T08:00:00.008+08:00|               1.0|
+-----------------------------+------------------+


# 如果想限制补值的范围,超过这个范围就不补了,可以再加个参数,要带单位
IoTDB> select s1 from root.turbine.d1 where time = 8 fill(float[previous,1ms])
+-----------------------------+------------------+
|                         Time|root.turbine.d1.s1|
+-----------------------------+------------------+
|1970-01-01T08:00:00.008+08:00|              null|
+-----------------------------+------------------+

最新のデータクエリ

最新のデータをリアルタイムで可視化するために、最新のデータポイントクエリ機能を別途用意しました。select lastキーワードを接頭辞として使用します。他の構文は元のデータと同じであり、述語フィルタリングを追加できません。

IoTDB> select last * from root
+-----------------------------+------------------+-----+
|                         Time|        timeseries|value|
+-----------------------------+------------------+-----+
|1970-01-01T08:00:00.010+08:00|root.turbine.d1.s1|  1.0|
|1970-01-01T08:00:00.010+08:00|root.turbine.d1.s2|  2.0|
+-----------------------------+------------------+-----+

集計クエリ

時系列の集計値をカウントするために、現時点では各時系列を独立したシーケンスとして扱い、集計も連続して行われます。次のバージョンでは、すべてのシーケンスを1つのパスに集約する機能が追加されます。

IoTDB> select count(*) from root where time <= 10
+-------------------------+-------------------------+-------------------------+
|count(root.turbine.d1.s1)|count(root.turbine.d1.s2)|count(root.turbine.d2.s1)|
+-------------------------+-------------------------+-------------------------+
|                        7|                        7|                        0|
+-------------------------+-------------------------+-------------------------+

0.10.0頻度集約クエリの削減

ダウン周波数集約0.10の構文は0.9とは異なります。まず、ダウン頻度集約クエリ構文の0.10.0バージョンを紹介します。例を挙げましょう。今年の5月の午前9時から午前12時までのシーケンスの平均値を確認してください。結果は次のようになります。

5月1日、9時〜12時:合計

5月2日9時-12時:集計

...

5月31日、9時〜12時:集計値

この柔軟なクエリを実行するには、スライディングウィンドウが必要です。ウィンドウは5月1日の9時に始まり、長さは3時間です。24時間前進して5月31日までスライドするたびに、各ウィンドウで平均が計算されます。値。

したがって、主に3つのパラメータを設計しました。

(1)スライディングウィンドウの開始と終了の範囲、左閉と右開の間隔:5月1日から31日

(2)スライディングウィンドウの長さ:3時間

(3)スライドステップ時間:24時間

ステートメントは次のとおりです(あまりデータを記述しなかったため、現時点ではすべて空です)。

select avg(s1) from root.turbine.d1 group by([2020-05-01T09:00:00, 2020-05-31T12:00:00), 3h, 24h)

もっと簡単な例を挙げましょう:5月の1日の平均を確認してください

この例では、スライディングウィンドウの長さがスライディングステップ長に等しいため、3番目のパラメーターを省略できます。

select avg(s1) from root.turbine.d1 group by([2020-05-01T00:00:00, 2020-06-01T00:00:00), 1d)

0.10.0サンプルのフィルイン値

0.10.0 group byクエリに基づく新しいクエリ関数。last_value集約関数を使用する場合、それはサンプリング関数です。特定の時間間隔内に値がない場合は、以前の値を使用して空白を埋めることもできます。

# 正常降采样,没数据的区间会填充 null
IoTDB> select last_value(s1) from root.turbine.d1 group by([1,10), 2ms)
+-----------------------------+------------------------------+
|                         Time|last_value(root.turbine.d1.s1)|
+-----------------------------+------------------------------+
|1970-01-01T08:00:00.001+08:00|                           1.0|
|1970-01-01T08:00:00.003+08:00|                           1.0|
|1970-01-01T08:00:00.005+08:00|                           1.0|
|1970-01-01T08:00:00.007+08:00|                          null|
|1970-01-01T08:00:00.009+08:00|                          null|
+-----------------------------+------------------------------+


# 降采样,如果某个区间没值,可以用前一个聚合值补空,填充函数为 previous
IoTDB> select last_value(s1) from root.turbine.d1 group by([1,10), 2ms) fill(float[previous])
+-----------------------------+------------------------------+
|                         Time|last_value(root.turbine.d1.s1)|
+-----------------------------+------------------------------+
|1970-01-01T08:00:00.001+08:00|                           1.0|
|1970-01-01T08:00:00.003+08:00|                           1.0|
|1970-01-01T08:00:00.005+08:00|                           1.0|
|1970-01-01T08:00:00.007+08:00|                           1.0|
|1970-01-01T08:00:00.009+08:00|                           1.0|
+-----------------------------+------------------------------+

さらに、空白値を入力する別の方法、previousuntillastもサポートします。前回の値を使用して、最新のポイントの時間値が入力されるまで空白を入力します。たとえば、ここでの最新のポイントのタイムスタンプは10、11、13です。 1ポイントは追加されなくなります。

IoTDB> select last_value(s1) from root.turbine.d1 group by((1,15], 2ms) fill(float[previousuntillast])
+-----------------------------+------------------------------+
|                         Time|last_value(root.turbine.d1.s1)|
+-----------------------------+------------------------------+
|1970-01-01T08:00:00.003+08:00|                           1.0|
|1970-01-01T08:00:00.005+08:00|                           1.0|
|1970-01-01T08:00:00.007+08:00|                           1.0|
|1970-01-01T08:00:00.009+08:00|                           1.0|
|1970-01-01T08:00:00.011+08:00|                           1.0|
|1970-01-01T08:00:00.013+08:00|                          null|
|1970-01-01T08:00:00.015+08:00|                          null|
+-----------------------------+------------------------------+

この文の間隔が前に開かれ、閉じられていることに気づいたかどうかはわかりません。結果セットは、閉じられた間隔の時点でもあります。このように、null値のサンプリングと入力のクエリは、group by fillステートメントによって実現されます。

0.9.xダウン頻度集約クエリ

古いバージョン0.9のダウン周波数集約構文は、0.10のそれとは異なります。いくつかのパラメータがあります

(1)セグメント間隔、時間軸をこの長さに従ってセグメントに分割します

(2)分割の起点、分割の開始点、任意のセグメントの終点を使用できます。デフォルトは、1970年1月1日、0:00:00、0:00:00がカッティングの起点として、タイムスタンプの0です。

(3)結果セットの表示範囲

最初の2つのパラメーターが固定された後、時間軸のセグメントが決定され、3番目のパラメーターは結果セットを指定します。

たとえば、5月の毎日の平均をクエリします。

select avg(s1) from root.turbine.d1 group by (1d, 2020-05-01 00:00:00, [2020-05-01 00:00:00, 2020-05-31 23:59:59]);

デバイスごとにクエリを調整する

上記の例から、IoTDBクエリのデフォルトのテーブル構造が[time、sequence 1、sequence 2、...、sequence n]であることがわかります。ある時点で存在しないシーケンスがある場合、すべてのシーケンスは時間に従って整列されます存在する場合、空白の値が入力されます。値のフィルタリングを行う場合、このテーブル構造のフィルタリングは非常に厳密になります。

クエリ時に各デバイスが互いに干渉しないようにするために、時間とデバイスによるクエリの整列をサポートしています。テーブル構造は[時間、デバイスID、測定ポイント1、測定ポイント2、...、測定ポイントn]です。これは関係ですテーブル構造は似ていますが、クエリステートメントの後にalign by deviceを追加するだけです 

IoTDB> select * from root align by device
+-----------------------------+---------------+---+---+
|                         Time|         Device| s1| s2|
+-----------------------------+---------------+---+---+
|1970-01-01T08:00:00.001+08:00|root.turbine.d1|1.0|2.0|
|1970-01-01T08:00:00.002+08:00|root.turbine.d1|1.0|2.0|
|1970-01-01T08:00:00.003+08:00|root.turbine.d1|1.0|2.0|
|1970-01-01T08:00:00.004+08:00|root.turbine.d1|1.0|2.0|
|1970-01-01T08:00:00.005+08:00|root.turbine.d1|1.0|2.0|
|1970-01-01T08:00:00.006+08:00|root.turbine.d1|1.0|2.0|
|1970-01-01T08:00:00.010+08:00|root.turbine.d1|1.0|2.0|
+-----------------------------+---------------+---+---+

総括する

今日の基本的な操作を最初に紹介します。具体的なSQL構文については、公式Webサイトを参照してください。この記事のSQLは、CLIにくっついて楽しむことができます〜皆さん、楽しい週末をお過ごしください!

ようこそ!感謝する!フォワード!

おすすめ

転載: blog.csdn.net/qiaojialin/article/details/106596017