Tag 데이터 삽입
개요
Machbase는 시간축과 거리축 Tag 데이터를 삽입하기 위한 여러 방법을 제공하며, 각 방법은 서로 다른 사용 사례에 최적화되어 있습니다. 데이터 볼륨과 애플리케이션 요구 사항에 가장 적합한 방법을 선택하십시오.
방법 1: INSERT 문
데이터를 삽입하는 가장 간단한 방법 - 소규모 데이터셋 및 테스트에 이상적입니다.
기본 INSERT 예제
Mach> create tag table TAG (name varchar(20) primary key, time datetime basetime, value double summarized);
Executed successfully.
Mach> insert into tag metadata values ('TAG_0001');
1 row(s) inserted.
-- Insert single values
Mach> insert into tag values('TAG_0001', now, 0);
1 row(s) inserted.
Mach> insert into tag values('TAG_0001', now, 1);
1 row(s) inserted.
Mach> insert into tag values('TAG_0001', now, 2);
1 row(s) inserted.
Mach> EXEC TABLE_FLUSH(tag);
Executed successfully.
Mach> select * from tag where name = 'TAG_0001';
NAME TIME VALUE
--------------------------------------------------------------------------------------
TAG_0001 2018-12-19 17:41:37 806:901:728 0
TAG_0001 2018-12-19 17:41:42 327:839:368 1
TAG_0001 2018-12-19 17:41:43 812:782:202 2
[3] row(s) selected.EXEC TABLE_FLUSH(tag)는 대화형 예제에서 방금 입력한 TAG 데이터를 즉시
조회하거나 통계 뷰에서 확인할 수 있게 합니다.
사용 시기: 테스트, 저용량 삽입, 대화형 데이터 입력
TAG metadata와 _LAST_UPDATE_TIME
metadata 컬럼이 없는 TAG 테이블은 기존처럼 name, time, value 세 값만 입력할 수 있습니다.
CREATE TAG TABLE sensor (
name VARCHAR(128) PRIMARY KEY,
time DATETIME BASETIME,
value DOUBLE
);
INSERT INTO sensor VALUES('tag1', now, 1);사용자 metadata 컬럼이 있는 TAG 테이블에서 column list 없이 신규 tag를 입력하려면 data 값과 사용자 metadata 값을 함께 제공합니다. _LAST_UPDATE_TIME 은 시스템이 관리하는 metadata 변경 시각이므로 입력 값에 포함하지 않습니다.
CREATE TAG TABLE sensor_meta (
name VARCHAR(128) PRIMARY KEY,
time DATETIME BASETIME,
value DOUBLE
)
METADATA (
site VARCHAR(32),
status INTEGER
);
INSERT INTO sensor_meta
VALUES('tag1', now, 1, 'seoul', 1);column list를 사용하는 경우에도 필요한 사용자 컬럼만 지정하고 _LAST_UPDATE_TIME 은 지정하지 않습니다.
INSERT INTO sensor_meta(name, time, value, site, status)
VALUES('tag2', now, 1, 'busan', 1);기존 tag의 metadata row가 이미 존재하는 경우 data-only insert는 metadata 값을 변경하지 않습니다. 따라서 _LAST_UPDATE_TIME 도 변경되지 않습니다.
거리축 INSERT 예제
거리축 Tag 테이블도 동일하게 INSERT를 사용하지만, 축 컬럼에는 숫자 값을 넣습니다.
Mach> CREATE TAG TABLE trip_sensor (
name VARCHAR(20) PRIMARY KEY,
distance_m DOUBLE BASE DISTANCE,
value DOUBLE,
quality INTEGER
);
Executed successfully.
Mach> INSERT INTO trip_sensor VALUES('ODO_A', 0, 10.1, 100);
1 row(s) inserted.
Mach> INSERT INTO trip_sensor VALUES('ODO_A', 500, 11.2, 101);
1 row(s) inserted.
Mach> INSERT INTO trip_sensor VALUES('ODO_B', 1000.1, 21.5, 100);
1 row(s) inserted.
Mach> EXEC TABLE_FLUSH(trip_sensor);
Executed successfully.DOUBLE 거리축은 소수 거리값을 그대로 저장할 수 있고, LONG/ULONG 거리축은 정수 거리값만 저장합니다.
방법 2: CSV 파일 임포트
csvimport 도구를 사용하여 CSV 파일에서 대량의 데이터를 빠르게 로드합니다.
CSV 파일 형식
태그 이름, 타임스탬프 및 값이 포함된 CSV 파일(data.csv)을 생성합니다:
TAG_0001, 2009-01-28 07:03:34 0:000:000, -41.98
TAG_0001, 2009-01-28 07:03:34 1:000:000, -46.50
TAG_0001, 2009-01-28 07:03:34 2:000:000, -36.16csvimport 사용
csvimport -t TAG -d data.csv -F "time YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn" -l error.log옵션 설명:
-t TAG: 대상 테이블 이름-d data.csv: 데이터 파일 경로-F: 시간 형식 지정-l error.log: 에러 로그 파일
사용 시기: 대량 로딩, 데이터 마이그레이션, 배치 임포트
중요: Machbase는 임포트 중 존재하지 않는 태그 이름을 자동 등록합니다. 단위, 위치, 상태 같은 메타데이터 값을 명시해야 하는 경우에는 데이터를 로드하기 전에 태그 메타데이터를 먼저 등록하십시오.
방법 3: RESTful API
HTTP 요청을 통해 데이터를 삽입합니다 - IoT 디바이스와 웹 애플리케이션에 완벽합니다.
API 구문
{
"values": [
[TAG_NAME, TAG_TIME, VALUE],
[TAG_NAME, TAG_TIME, VALUE],
...
],
"date_format": "YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn"
}date_format이 생략되면 기본 형식 YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn이 사용됩니다.
시간축 Tag 테이블은 축 값에 날짜/시간 문자열을 사용하고, 거리축 Tag 테이블은 축 컬럼 타입에 맞는 숫자 값을 사용합니다.
API 예제
curl -X POST http://localhost:5657/machiot/datapoints/raw/TAG \
-H "Content-Type: application/json" \
-d '{
"date_format": "YYYY-MM-DD HH24:MI:SS",
"values": [
["TAG_0001", "2024-01-01 10:00:00", 25.5],
["TAG_0001", "2024-01-01 10:01:00", 26.0],
["TAG_0002", "2024-01-01 10:00:00", 30.2]
]
}'사용 시기: IoT 디바이스, 실시간 데이터 스트리밍, 웹 애플리케이션
방법 4: SDK 통합
애플리케이션에서 프로그래밍 방식의 데이터 삽입을 위해 Machbase SDK를 사용합니다.
지원 언어
- C/C++ 라이브러리 - 고성능 네이티브 통합
- Java 라이브러리 - Java 애플리케이션
- Python 라이브러리 - 데이터 과학 및 자동화
- C# 라이브러리 - .NET 애플리케이션
Python 예제
import machbaseAPI as mach
# Connect to Machbase
conn = mach.connect(host='localhost', port=5656)
# Insert data
cursor = conn.cursor()
cursor.execute("""
INSERT INTO tag VALUES (?, ?, ?)
""", ('TAG_0001', '2024-01-01 10:00:00', 25.5))
conn.commit()
conn.close()사용 시기: 애플리케이션 통합, 자동화된 데이터 수집, 사용자 정의 도구
적절한 방법 선택
| 방법 | 적합한 경우 | 장점 | 단점 |
|---|---|---|---|
| INSERT | 테스트, 소규모 데이터셋 | 간단합니다, 대화형 | 대용량 데이터에는 느림 |
| CSV 임포트 | 대량 로딩, 마이그레이션 | 매우 빠름, 효율적 | 파일 준비 필요 |
| RESTful API | IoT, 웹 앱 | 유연합니다, 플랫폼 독립적 | 네트워크 오버헤드 |
| SDK | 애플리케이션 | 완전한 제어, 타입 안전성 | 개발 필요 |
추가 컬럼 사용
Tag 테이블에 추가 컬럼이 있는 경우 삽입 시 포함시킵니다:
축 값은 항상 테이블 정의 순서와 타입을 따라야 합니다. 시간축은 DATETIME, 거리축은 DOUBLE/LONG/ULONG 값이 들어갑니다.
-- Tag table with additional columns
CREATE TAG TABLE sensors (
name VARCHAR(20) PRIMARY KEY,
time DATETIME BASETIME,
value DOUBLE,
location VARCHAR(50),
status SHORT
);
-- Insert with additional columns
INSERT INTO sensors VALUES (
'TEMP_001',
'2024-01-01 10:00:00',
25.5,
'Building A',
1
);모범 사례
- 필요한 경우 태그 메타데이터 등록: 없는 태그 이름은 자동 등록됩니다. 메타데이터 값을 명시해야 할 때 먼저 등록합니다.
_LAST_UPDATE_TIME은 서버가 자동 관리하므로 직접 입력하지 않습니다 - 배치 작업 사용: 대규모 데이터셋의 경우 CSV 임포트 또는 배치 API 호출을 사용합니다
- 에러 처리: 항상 반환 값을 확인하고 에러를 로그에 기록합니다
- 시간 정밀도: 데이터 전체에서 타임스탬프 정밀도를 일관되게 유지합니다
- 데이터 검증: 태그 이름과 타임스탬프가 운영 규칙을 따르는지 확인합니다
성능 팁
- CSV 임포트: 대량 데이터(수백만 행)에 가장 빠름
- 배치 삽입: 여러 INSERT 문을 트랜잭션으로 그룹화
- 병렬 로딩: 병렬 수집을 위해 여러 csvimport 프로세스 사용
- 준비된 문: SDK에서 더 나은 성능을 위해 파라미터화된 쿼리 사용
다음 단계
- Tag 데이터 쿼리에서 데이터 검색에 대해 학습합니다
- Tag 인덱스에서 쿼리 최적화를 탐색합니다
- 롤업 테이블에서 시계열 집계를 이해합니다