smart-meter/
├── start_service.sh # 启动数据库单机服务脚本
├── prepare_data.sh # 解压 rdb/tsdb 示例数据
├── create_load.sh # 导入 rdb/tsdb 数据
├── create_load.sql # 数据导入 SQL
├── query.sh # 执行智能电表场景查询
├── query.sql # 智能电表场景 SQL
├── kwdb_common.sh # 本机与容器模式公共函数
├── smart_meter_test.sh # 一键体验脚本
├── extern/ # rdb.tar.gz 与 tsdb.tar.gz 数据包
├── table-schema.md # 表结构设计
├── scenario.md # 场景示例
└── README.md # 智能电表示例说明文档
注:脚本依赖 Bash。本机部署模式适用于 Linux 环境;容器部署模式依赖 Docker CLI,并要求 KWDB 容器已经运行。
您可以在表结构设计中查看智能电表模型的表设计。
-
将
smart-meter/目录中的脚本、SQL 文件和extern/数据包放到 KWDB 二进制目录下方。 -
执行
start_service.sh启动数据库单机服务(如已启动请忽略本步骤)。bash start_service.sh
注:如果
--listen-addr服务监听端口以及--http-addradmin UI 端口被占用,需要重新指定,如:bash start_service.sh 11221 8008 ./kwbase-data12,参数1是服务监听端口,参数2是 admin UI 端口,参数3是数据保存目录。 -
执行
prepare_data.sh,将rdb.tar.gz和tsdb.tar.gz解压到本地数据目录的extern下。bash prepare_data.sh ./kwbase-data
rdb.tar.gz和tsdb.tar.gz文件存放在 extern 目录下,您可自行下载后解压到extern目录下。
-
执行
create_load.sh导入rdb和tsdb数据。bash create_load.sh
注:
create_load.sql会先删除示例库rdb、tsdb,再重新导入数据,便于重复执行一键体验。 -
执行
query.sh体验智能电表场景查询。bash query.sh
Tips:可以直接执行 smart_meter_test.sh 脚本,一键体验全流程。
bash smart_meter_test.sh适用于 KWDB 已经通过 Docker 容器部署并运行的场景。容器模式会:
- 将
extern/rdb.tar.gz和extern/tsdb.tar.gz解压到本地数据目录。 - 通过
docker cp将本地生成的extern/rdb和extern/tsdb复制到容器内 KWDB 数据目录。 - 通过
docker exec调用容器内的kwbase sql执行数据导入与场景查询。
默认参数如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
--port |
26257 |
容器内 KWDB SQL 端口 |
--container-store |
自动识别 kwbase start 的 --store,识别失败时使用 /kwdb-data |
容器内 KWDB 数据目录 |
--container-kwbase |
/kaiwudb/bin/kwbase |
容器内 kwbase 路径 |
--data-path |
kwbase-data |
本地解压示例数据的目录 |
如果使用默认参数,可以直接执行:
cd smart-meter
bash smart_meter_test.sh --container <kwdb_container_name>如果容器内端口、数据目录或 kwbase 路径不同,可以显式指定:
bash smart_meter_test.sh \
--container <kwdb_container_name> \
--port 26257 \
--container-store /kwdb-data \
--container-kwbase /kaiwudb/bin/kwbase \
--data-path ./kwbase-data注:容器模式不会创建或启动 Docker 容器,请先使用项目实际的 KWDB 镜像启动容器,并确认容器内 KWDB 服务已可用。
导入 rdb 数据
import database csv data ("nodelocal://1/rdb"); job_id | status | fraction_completed | rows | abandon_rows | reject_rows | note
----------------------+-----------+--------------------+------+--------------+-------------+-------
1064039269816729601 | succeeded | 1 | 305 | 0 | 0 | None
(1 row)关系库导入验证:
root@127.0.0.1:26257/rdb> show tables;
table_name | table_type
--------------+-------------
alarm_rules | BASE TABLE
area_info | BASE TABLE
meter_info | BASE TABLE
user_info | BASE TABLE
(4 rows)
Time: 2.971167ms导入 tsdb 数据
import database csv data ("nodelocal://1/tsdb"); job_id | status | fraction_completed | rows | abandon_rows | reject_rows | note
---------+-----------+--------------------+-------+--------------+-------------+-------
- | succeeded | 1 | 10100 | 0 | 0 | None
(1 row)
Time: 240.805ms时序库导入验证:
root@127.0.0.1:26257/tsdb> show tables;
table_name | table_type
-------------+--------------------
meter_data | TIME SERIES TABLE
(1 row)
Time: 3.142458ms若想插入任意条数据可修改下面示例中的 generate_series(1, 10000) 中的数字,代表插入的条数。
以下示例为 10000 条数据:
INSERT INTO tsdb.meter_data(ts, voltage, current, power, energy, meter_id)
SELECT
NOW()-(s*10)::int * INTERVAL '1 minute',
220.0 + (s%10)::float,
5.0 + (s%15)::float * 0.1,
1000.0 + (s%20)::float * 50,
5000.0 + s::float * 10,
'M' || ((s%100)+1)::text
FROM generate_series(1, 10000) AS s;完成数据准备后,请查看场景示例中的内容,执行其中的 SQL 语句,验证相应场景。