파형 데이터 만들어 보기

파형 데이터 만들어 보기

이 튜토리얼은 순수 셸 스크립트만으로 데이터베이스에 데이터를 쓰고 읽는 방법을 설명합니다.

📌
예시를 진행하려면 아래 테이블을 미리 생성해 두어야 합니다.
CREATE TAG TABLE IF NOT EXISTS EXAMPLE  (
    NAME VARCHAR(20) PRIMARY KEY,
    TIME DATETIME BASETIME,
    VALUE DOUBLE SUMMARIZED
);

데이터 쓰기

machbase-neo에 데이터를 쓰는 가장 간단한 방법은 명령줄 도구 machbase-neo shell을 사용하는 것입니다. 이 도구를 이용해 테이블을 가져오고(import), 내보내고(export), 조회할 수 있습니다.

데이터 생성

예시에서는 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 이름과 함께 유닉스 타임스탬프, 값을 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을 참고해 주세요.

A each line of CSV that are generated by shell script is processed in machbase-neo shell import then “import” into EXAMPLE table.

동일한 방식으로 직접 데이터를 입력할 수도 있습니다.

echo "wave.pi,1674860125,3.141592" | machbase-neo shell import -t s EXAMPLE

or

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

Table view

It is also possible browsing query result forward/backward with “walk” command like below.

machbase-neo shell walk "select * from EXAMPLE order by time desc"

Then you can scroll up/down with keyboard, press ESC to exit table view.

Press r to re-execute query to refresh result, it is particularly useful with query was sorted by order by time desc to see the latest values when data is continuously being written.

img

Query Output format

JSON

Use --format json option

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

Use --format csv option

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

Use --no-heading option to exclude the first line header

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

Query Time format

Use --timeformat option to specify time output format.

Execute help timeformat to display pre-defined formats and syntax for custom format.

machbase-neo shell help timeformat

Pre-defined timeformats

NameFormat
Default,-2006-01-02 15:04:05.999
ns, us, ms, s(UNIX epoch in nano-, milli-, micro-, seconds as 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
…(there are more)…Please consult machbase-neo shell help timeformat

Try --timeformat numeric format.

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 is a shorten alias of --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

Custom time format

It is also possible your own custom format.

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
ValueSymbol
year2006
month01
day02
hour03 or 15
minute04
second05 or with sub-seconds ‘05.999’ or ‘05.000’

Combine time format and time zone

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
ℹ️
Since s,ms,us and ns formats are represents UNIX epoch time. If one of these formats are used, --tz option is ignored. Because epoch time is always in UTC.
최근 업데이트