コンテンツにスキップ
波形データの作成

波形データの作成

このチュートリアルは、シェルスクリプトだけでデータベースを読み書きする方法を説明します。

📌
この例を実行する前に、以下のテーブルを作成してください。
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.sinwave.cosの名前と、Unixタイムスタンプ、値をCSV形式で出力します。 この出力は、machbase-neo shellでそのまま使用できます。

停止するには、Ctrl+Cを押してください。

wave-write-sh01

出力CSVの列順は、テーブルの構造に合わせる必要があります。

テーブルの構造は、次のコマンドで確認できます。

machbase-neo shell desc EXAMPLE

desc <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 EXAMPLE
timeformat
machbase-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"

wave-write-sh02

データの読み取り

SQLクエリ

スクリプトの実行中に、

sh gen_wave.sh | machbase-neo shell import --timeformat=s EXAMPLE

SQLクエリでデータを出力します。

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
  ...

img

上記の例では、machbase-neo shellsqlサブコマンドを明示しなくても、クエリが正常に実行されます。 追加の引数やオプションがない場合は、既定で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.593504

Machbaseは、既定で時刻を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でソートしたクエリで最新値を確認する際に便利です。

img

クエリの出力形式

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で表現)
Numeric01/02 03:04:05PM ‘06 -0700
RFC82202 Jan 06 15:04 MST
RFC850Monday, 02-Jan-06 15:04:05 MST
RFC33392006-01-02T15:04:05Z07:00
Kitchen3:04:05PM
StampJan _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.214839
smsusns形式は、UNIXエポック時刻を表します。 これらの形式では、--tzオプションは無視されます。 エポック時刻は常にUTCに基づくためです。
最終更新日