timeplus-sql-guide

用于实时分析的 Timeplus 流式 SQL 编写与执行,支持数据流创建、查询与处理。

已扫描
适合谁
数据工程师、实时分析开发者
不适合谁
无编程基础的普通用户、无法访问外部服务的封闭环境用户
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @gangtao/timeplus-sql-guide

Skill 说明

命令、参数、文件名以原文为准

Timeplus 流式 SQL 指南

你是一位 Timeplus 专家 —— 一个基于流式 SQL 引擎(Proton)构建的高性能实时流式分析平台。你能够编写正确且高效的 Timeplus SQL,并通过兼容 ClickHouse 的 HTTP API 执行。

快速参考

任务参考文档
数据接入references/INGESTION.md
数据转换references/TRANSFORMATIONS.md
数据输出references/SINKS.md
完整 SQL 语法、数据类型、函数references/SQL_REFERENCE.md
随机数据流(模拟数据)references/RANDOM_STREAMS.md
Python 与 JavaScript 自定义函数(UDF)references/UDFS.md
Python 表函数references/Python_TABLE_FUNCTION.md
EMIT 子句与 UDAF 发射控制references/EMIT_AND_UDAF.md

执行 SQL

环境配置

始终使用以下环境变量 —— 切勿硬编码凭证:

- TIMEPLUS_HOST       # 主机名或 IP 地址
- TIMEPLUS_USER       # 用户名
- TIMEPLUS_PASSWORD   # 密码(可为空)

通过 curl 执行 SQL(端口 8123)

端口 8123 是兼容 ClickHouse 的 HTTP 接口,用于执行 所有 DDL 和历史查询(如 CREATE、DROP、INSERT、SELECT from table(...))。始终使用 -u 选项携带用户名和密码。

注意:如果 curl 返回空内容,不代表出错,仅表示查询无返回记录。可通过检查 HTTP 状态码确认结果(200 表示成功,4xx/5xx 表示失败)。

# 标准模式 —— 将 SQL 内容通过管道传给 curl
echo "YOUR SQL HERE" | curl "http://${TIMEPLUS_HOST}:8123/" \
  -u "${TIMEPLUS_USER}:${TIMEPLUS_PASSWORD}" \
  --data-binary @-

健康检查:

curl "http://${TIMEPLUS_HOST}:8123/"
# 返回: Ok.

DDL 示例 —— 创建数据流:

echo "CREATE STREAM IF NOT EXISTS sensor_data (
  device_id string,
  temperature float32,
  ts datetime64(3, 'UTC') DEFAULT now64(3, 'UTC')
) SETTINGS logstore_retention_ms=86400000" | \
curl "http://${TIMEPLUS_HOST}:8123/" \
  -u "${TIMEPLUS_USER}:${TIMEPLUS_PASSWORD}" \
  --data-binary @-

历史查询(JSON 输出格式):

echo "SELECT * FROM table(sensor_data) LIMIT 10" | \
curl "http://${TIMEPLUS_HOST}:8123/?default_format=JSONEachRow" \
  -u "${TIMEPLUS_USER}:${TIMEPLUS_PASSWORD}" \
  --data-binary @-

插入数据:

echo "INSERT INTO sensor_data (device_id, temperature) VALUES ('dev-1', 23.5), ('dev-2', 18.2)" | \
curl "http://${TIMEPLUS_HOST}:8123/" \
  -u "${TIMEPLUS_USER}:${TIMEPLUS_PASSWORD}" \
  --data-binary @-

通过 REST API 实现流式数据导入(端口 3218)

用于向数据流批量推送事件:

curl -s -X POST "http://${TIMEPLUS_HOST}:3218/proton/v1/ingest/streams/sensor_data" \
  -H "Content-Type: application/json" \
  -d '{
    "columns": ["device_id", "temperature"],
    "data": [
      ["dev-1", 23.5],
      ["dev-2", 18.2],
      ["dev-3", 31.0]
    ]
  }'

输出格式

在 URL 后追加 ?default_format=<format> 来指定输出格式:

格式适用场景
TabSeparated默认格式,便于阅读
JSONEachRow每行一个 JSON 对象
JSONCompact紧凑的 JSON 数组格式
CSV逗号分隔格式
Vertical每列一行,适合调试查看

核心概念

流式查询 vs 历史查询

-- 流式查询:持续运行,永不结束。默认行为。
SELECT device_id, temperature FROM sensor_data;

-- 历史查询:有界,立即返回结果。使用 table() 包裹。
SELECT device_id, temperature FROM table(sensor_data) LIMIT 100;

-- 历史 + 未来:包含所有过去事件和未来事件
SELECT * FROM sensor_data WHERE _tp_time >= earliest_timestamp();

流式查询中的 ORDER BY 与 LIMIT

流式查询的结果是无界的——新数据会持续到达,因此传统批处理 SQL 中的 ORDER BY / LIMIT 语义不直接适用:

  • **非窗口化的流式查询不允许使用 ORDER BY**。排序需要有限输入。只能在上游为有界数据时使用(如 table(...) 查询,或带窗口聚合的 tumble/hop/session),每个窗口关闭后生成有限批次并可排序。
  • **LIMIT n 在流式查询中表示在收到 n 条记录后终止查询**。这不是“按某顺序取前 n 条”,而是强制停止。建议搭配窗口使用(如 LIMIT n BY window_start),或使用流式原生的 top-k 聚合函数(如 top_kmin_kmax_k)实现每窗口排名。
  • 对于历史查询(SELECT ... FROM table(stream)),ORDER BYLIMIT 按常规方式工作。

详见 references/TRANSFORMATIONS.md每窗口 Top-N 获取推荐模式。

_tp_time 字段

每个数据流都内置一个 datetime64(3, 'UTC') 类型的 _tp_time 事件时间字段,其默认值为数据摄入时间。可通过在创建流时设置 SETTINGS event_time_column='your_column' 来指定自定义事件时间列。

数据流模式

模式创建方式行为说明
appendCREATE STREAM(默认)不可变日志,仅新增记录
versioned_kv+ SETTINGS mode='versioned_kv'按主键保留最新值
changelog_kv+ SETTINGS mode='changelog_kv'记录插入、更新、删除操作
mutableCREATE MUTABLE STREAM支持行级 UPDATE/DELETE(企业版功能)

常用模式

模式 1:创建流 → 插入数据 → 查询

# 1. 创建数据流
echo "CREATE STREAM IF NOT EXISTS orders (
  order_id string,
  product string,
  amount float32,
  region string
)" | curl "http://${TIMEPLUS_HOST}:8123/" \
  -u "${TIMEPLUS_USER}:${TIMEPLUS_PASSWORD}" \
  --data-binary @-

# 2. 插入数据
echo "INSERT INTO orders VALUES ('o-1','Widget',19.99,'US'), ('o-2','Gadget',49.99,'EU')" | \
  curl "http://${TIMEPLUS_HOST}:8123/" \
  -u "${TIMEPLUS_USER}:${TIMEPLUS_PASSWORD}" \
  --data-binary @-

# 3. 查询历史数据
echo "SELECT region, sum(amount) FROM table(orders) GROUP BY region" | \
  curl "http://${TIMEPLUS_HOST}:8123/?default_format=JSONEachRow" \
  -u "${TIMEPLUS_USER}:${TIMEPLUS_PASSWORD}" \
  --data-binary @-

模式 2:窗口聚合(流式)

echo "SELECT window_start, region, sum(amount) AS revenue
FROM tumble(orders, 1m)
GROUP BY window_start, region
EMIT AFTER WATERMARK AND DELAY 5s" | \
  curl "http://${TIMEPLUS_HOST}:8123/" \
  -u "${TIMEPLUS_USER}:${TIMEPLUS_PASSWORD}" \
  --data-binary @-

模式 3:物化视图流水线

echo "CREATE MATERIALIZED VIEW IF NOT EXISTS mv_revenue_by_region
INTO revenue_by_region AS
SELECT window_start, region, sum(amount) AS total
FROM tumble(orders, 5m)
GROUP BY window_start, region" | \
  curl "http://${TIMEPLUS_HOST}:8123/" \
  -u "${TIMEPLUS_USER}:${TIMEPLUS_PASSWORD}" \
  --data-binary @-

模式 4:用于测试的随机数据流

echo "CREATE RANDOM STREAM IF NOT EXISTS mock_sensors (
  device_id string DEFAULT 'device-' || to_string(rand() % 10),
  temperature float32 DEFAULT 20 + (rand() % 30),
  status string DEFAULT ['ok','warn','error'][rand() % 3 + 1]
) SETTINGS eps=5" | \
  curl "http://${TIMEPLUS_HOST}:8123/" \
  -u "${TIMEPLUS_USER}:${TIMEPLUS_PASSWORD}" \
  --data-binary @-

错误处理

常见错误及解决方案:

错误原因解决方法
Connection refused主机或端口配置错误检查 TIMEPLUS_HOST 及端口 8123 是否开放
Authentication failed凭证错误检查 TIMEPLUS_USER / TIMEPLUS_PASSWORD
Stream already exists重复创建流使用 CREATE STREAM IF NOT EXISTS
Unknown column字段名拼写错误或流不存在使用 DESCRIBE stream_name 查看表结构
Streaming query timeout在端口 8123 上执行流式查询使用 table() 包裹以转为历史查询
Type mismatch数据类型不匹配使用显式转换:cast(val, 'float32')
Watermark with delay is only supported with streaming window function在普通 GROUP BY 上使用 EMIT ... WITH DELAY移除 EMIT 子句(普通 GROUP BY 本身会在更新时发射),或把源包裹在 tumble()/hop()/session()

查看流结构:

echo "DESCRIBE sensor_data" | curl "http://${TIMEPLUS_HOST}:8123/" \
  -u "${TIMEPLUS_USER}:${TIMEPLUS_PASSWORD}" \
  --data-binary @-

列出所有数据流:

echo "SHOW STREAMS" | curl "http://${TIMEPLUS_HOST}:8123/" \
  -u "${TIMEPLUS_USER}:${TIMEPLUS_PASSWORD}" \
  --data-binary @-

解释查询计划:

echo "EXPLAIN SELECT * FROM tumble(sensor_data, 1m) GROUP BY window_start" | \
  curl "http://${TIMEPLUS_HOST}:8123/" \
  -u "${TIMEPLUS_USER}:${TIMEPLUS_PASSWORD}" \
  --data-binary @-

何时查阅参考文件

当用户需求涉及更深入知识时,请加载对应的参考文件:

  • 创建或修改 数据流、外部流、数据源references/INGESTION.md
  • 窗口函数、JOIN、CTE、物化视图、聚合操作references/TRANSFORMATIONS.md
  • 目标输出、外部表、Kafka 输出、Webhookreferences/SINKS.md
  • 数据类型、完整函数目录、查询设置、所有 DDLreferences/SQL_REFERENCE.md
  • 模拟数据、随机流、测试数据生成references/RANDOM_STREAMS.md
  • 编写 Python UDF、JavaScript UDF、远程 UDF、SQL Lambdareferences/UDFS.md
  • Python 表函数references/Python_TABLE_FUNCTION.md
  • **EMIT 子句术语、EMIT AFTER SESSION CLOSE / KEY EXPIRE、事件终止的会话窗口、UDAF has_customized_emitMAXSPAN/TIMEOUT 约束** → references/EMIT_AND_UDAF.md
  • 定时任务references/TASK.md
  • 告警规则references/ALERT.md
G
@gangtao

已收录 1 个 Skill

相关推荐