波形データの作成
このチュートリアルは、シェルスクリプトだけでデータベースを読み書きする方法を説明します。
CREATE TAG TABLE IF NOT EXISTS EXAMPLE (
NAME VARCHAR(20) PRIMARY KEY,
TIME DATETIME BASETIME,
VALUE DOUBLE SUMMARIZED
);データの書き込み
machbase-neoにデータを書き込む最も簡単な方法は、コマンドラインツールmachbase-neo shellを使う方法です。
このツールで、テーブルのインポート、エクスポート、検索を行えます。
データの生成
この例では、1秒ごとにサイン・コサイン値を出力する簡単なシェルスクリプトを使用します。
以下のスクリプトをコピーし、gen_wave.shとして保存してください。
#!/bin/bash
angle=0
step_angle=24
sinval=0
cosval=0
PI=3.14159
while [ 1 ]
do
ts=`date +"%s"`
sinval=$(awk "BEGIN{ printf \"%.6f\", (sin($angle*($PI/180)))}")
cosval=$(awk "BEGIN{ printf \"%.6f\", (cos($angle*($PI/180)))}")
echo "wave.sin,$ts,$sinval"
echo "wave.cos,$ts,$cosval"
sleep 1
angle=$((angle+step_angle))
doneスクリプトの実行
作成したスクリプトを実行します。
sh ./gen_wave.shスクリプトは毎秒、wave.sin、wave.cosの名前と、Unixタイムスタンプ、値をCSV形式で出力します。
この出力は、machbase-neo shellでそのまま使用できます。
停止するには、Ctrl+Cを押してください。

出力CSVの列順は、テーブルの構造に合わせる必要があります。
テーブルの構造は、次のコマンドで確認できます。
machbase-neo shell desc EXAMPLEdesc <table>サブコマンドは、テーブル情報を表示します。
TABLE EXAMPLE
TYPE Tag Table
TAGS wave.cos, wave.sin
┌───┬───────┬──────────┬────────┐
│ # │ NAME │ TYPE │ LENGTH │
├───┼───────┼──────────┼────────┤
│ 1 │ NAME │ varchar │ 100 │
│ 2 │ TIME │ datetime │ 8 │
│ 3 │ VALUE │ double │ 8 │
└───┴───────┴──────────┴────────┘CSVをテーブルにインポートする場合は、列順とデータ型をテーブル定義に必ず合わせてください。
スクリプトとコマンドの組み合わせ
スクリプトの出力を、machbase-neo shellの入力に使用します。
sh gen_wave.sh | machbase-neo shell import --timeformat=s EXAMPLEmachbase-neoは、すべてのタイムスタンプをナノ秒単位で扱います。 シェルスクリプトは
dateコマンドで秒単位のタイムスタンプを生成するため、
--timeformatオプションで、CSVデータの時刻が秒単位であることを明示する必要があります。詳細は、
machbase-neo shell help timeformatを参照してください。シェルスクリプトが生成したCSVの各行は、machbase-neo shell importで処理され、EXAMPLEテーブルに取り込まれます。
同じ方式で、データを直接入力することもできます。
echo "wave.pi,1674860125,3.141592" | machbase-neo shell import -t s EXAMPLEまたは
echo "wave.pi,`date +%s`,3.141592" | machbase-neo shell import -t s EXAMPLE最新の値を検索します。
machbase-neo shell "select * from EXAMPLE where NAME='wave.pi' order by time desc limit 1"
データの読み取り
SQLクエリ
スクリプトの実行中に、
sh gen_wave.sh | machbase-neo shell import --timeformat=s EXAMPLESQLクエリでデータを出力します。
machbase-neo shell "select * from EXAMPLE order by time desc" # NAME TIME(UTC) VALUE
────────────────────────────────────────────────
1 wave.sin 2023-01-28 14:03:59 0.214839
2 wave.cos 2023-01-28 14:03:59 -0.976649
3 wave.sin 2023-01-28 14:03:58 0.593504
4 wave.cos 2023-01-28 14:03:58 -0.804831
...
上記の例では、machbase-neo shellにsqlサブコマンドを明示しなくても、クエリが正常に実行されます。
追加の引数やオプションがない場合は、既定でsqlサブコマンドを使用するためです。
つまり、machbase-neo shell "select..."とmachbase-neo shell sql "select..."は同じです。
オプションを使用する場合は、以下のようにsqlサブコマンドを明示してください。
machbase-neo shell sql \
--tz America/Los_Angeles \
"select * from EXAMPLE order by time desc limit 4" # NAME TIME(AMERICA/LOS_ANGELES) VALUE
───────────────────────────────────────────────────
1 wave.sin 2023-01-28 06:03:59 0.214839
2 wave.cos 2023-01-28 06:03:59 -0.976649
3 wave.cos 2023-01-28 06:03:58 -0.804831
4 wave.sin 2023-01-28 06:03:58 0.593504Machbaseは、既定で時刻をUTCで表示します。
他のタイムゾーンで表示するには、--tzオプションを使用します。
local、またはEurope/ParisなどのTZデータベース文字列を指定できます。
machbase-neo shell sql \
--tz local \
"select * from EXAMPLE order by time desc limit 4" # NAME TIME(LOCAL) VALUE
─────────────────────────────────────────────
1 wave.sin 2023-01-28 23:03:59 0.214839
2 wave.cos 2023-01-28 23:03:59 -0.976649
3 wave.cos 2023-01-28 23:03:58 -0.804831
4 wave.sin 2023-01-28 23:03:58 0.593504表形式の表示
以下のように「walk」コマンドで、クエリ結果を前後に移動して表示できます。
machbase-neo shell walk "select * from EXAMPLE order by time desc"キーボードで上下にスクロールし、ESCで表の表示を終了します。
rを押すと、クエリを再実行して結果を更新します。データが継続的に書き込まれる場合、order by time descでソートしたクエリで最新値を確認する際に便利です。

クエリの出力形式
JSON
--format jsonオプションを使用します。
machbase-neo shell sql \
--format json \
"select * from EXAMPLE order by time desc limit 4"{
"data": {
"columns": ["ROWNUM","NAME","TIME(UTC)","VALUE"],
"types": ["string","string","datetime","double"],
"rows": [
[1,"wave.sin","2023-01-28 14:03:59",0.214839],
[2,"wave.cos","2023-01-28 14:03:59",-0.976649],
[3,"wave.cos","2023-01-28 14:03:58",-0.804831],
[4,"wave.sin","2023-01-28 14:03:58",0.593504]
]
}
}CSV
--format csvオプションを使用します。
machbase-neo shell sql \
--format csv \
"select * from EXAMPLE order by time desc limit 4"#,NAME,TIME(UTC),VALUE
1,wave.sin,2023-01-28 14:03:59,0.214839
2,wave.cos,2023-01-28 14:03:59,-0.976649
3,wave.cos,2023-01-28 14:03:58,-0.804831
4,wave.sin,2023-01-28 14:03:58,0.593504先頭のヘッダー行を除くには、--no-headingオプションを使用します。
machbase-neo shell sql \
--format csv \
--no-heading \
"select * from EXAMPLE order by time desc limit 4"1,wave.sin,2023-01-28 14:03:59,0.214839
2,wave.cos,2023-01-28 14:03:59,-0.976649
3,wave.cos,2023-01-28 14:03:58,-0.804831
4,wave.sin,2023-01-28 14:03:58,0.593504クエリの時刻形式
時刻の出力形式は、--timeformatオプションで指定します。
help timeformatを実行すると、定義済みの形式とカスタム形式の構文を表示します。
machbase-neo shell help timeformat定義済みの時刻形式
| 名前 | 形式 |
|---|---|
| Default,- | 2006-01-02 15:04:05.999 |
| ns, us, ms, s | (UNIXエポック時刻をナノ秒、マイクロ秒、ミリ秒、秒単位のint64で表現) |
| Numeric | 01/02 03:04:05PM ‘06 -0700 |
| RFC822 | 02 Jan 06 15:04 MST |
| RFC850 | Monday, 02-Jan-06 15:04:05 MST |
| RFC3339 | 2006-01-02T15:04:05Z07:00 |
| Kitchen | 3:04:05PM |
| Stamp | Jan _2 15:04:05 |
| …その他… | machbase-neo shell help timeformatを参照 |
--timeformat numeric形式を試します。
machbase-neo shell sql \
--timeformat numeric \
"select * from example where name='wave.sin' order by time desc limit 1" # NAME TIME(UTC) VALUE
───────────────────────────────────────────────────
1 wave.sin 01/28 02:03:59PM '23 +0000 0.214839-tは、--timeformatの短い別名です。
machbase-neo shell sql \
-t ms \
"select * from example where name='wave.sin' order by time desc limit 1" # NAME TIME(UTC) VALUE
──────────────────────────────────────
1 wave.sin 1674914639000 0.214839カスタム時刻形式
独自の形式を指定することもできます。
machbase-neo shell sql \
--timeformat "2006.01.02 (15:04:05.000)" \
"select * from example where name='wave.sin' order by time desc limit 1" # NAME TIME(UTC) VALUE
────────────────────────────────────────────────────
1 wave.sin "2023.01.28 (14:03:59.000)" 0.214839| 値 | 記号 |
|---|---|
| 年 | 2006 |
| 月 | 01 |
| 日 | 02 |
| 時 | 03または15 |
| 分 | 04 |
| 秒 | 05、または小数秒を含む'05.999’、‘05.000’ |
時刻形式とタイムゾーンの組み合わせ
machbase-neo shell sql \
--tz Europe/Paris \
--timeformat "2006.01.02 (15:04:05.000)" \
"select * from example where name='wave.sin' order by time desc limit 1" # NAME TIME(EUROPE/PARIS) VALUE
────────────────────────────────────────────────────
1 wave.sin "2023.01.28 (15:03:59.000)" 0.214839s、ms、us、ns形式は、UNIXエポック時刻を表します。
これらの形式では、--tzオプションは無視されます。
エポック時刻は常にUTCに基づくためです。