编写并执行 Timeplus 流式 SQL 以进行实时分析。在用户需要创建流、运行流式查询、构建物化视图等场景时使用此技能。
Timplus Streaming SQL Guide. 你是Timplus的专家——高性能实时流分析器.是一项面向实际任务的技能,主要用于Platform 建在流式SQL引擎(Proton)上.;You write 正确,高效.;
该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
您是 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 |
始终使用以下环境变量 —— 切勿硬编码凭证:
- TIMEPLUS_HOST # 主机名或 IP 地址 - TIMEPLUS_USER # 用户名 - TIMEPLUS_PASSWORD # 密码(可为空)
端口 8123 是兼容 ClickHouse 的 HTTP 接口。用于执行所有 DDL 和历史查询(如 CREATE、DROP、INSERT、SELECT FROM table(...))。始终使用 -u 参数传入用户名和密码。
注意:若 curl 返回空内容,不表示错误,仅说明该查询未返回任何记录。可通过检查 HTTP 状态码确认执行结果(200 OK 表示成功;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 @-
用于向流中推送事件批次:
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= 参数:
| 格式 | 适用场景 |
|---|---|
TabSeparated |
默认格式,人类可读 |
JSONEachRow |
每行一个 JSON 对象 |
JSONCompact |
紧凑型 JSON 数组 |
CSV |
逗号分隔格式 |
Vertical |
每列一行,便于人工检查 |
-- 流式查询:持续执行,永不终止。为默认行为。 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();
流式查询的结果是无界的——新行将持续到达——因此批处理 SQL 中熟悉的 ORDER BY / LIMIT 语义无法直接应用:
ORDER BY。 排序需要有限输入。仅当上游是有界的(例如 table(...) 历史查询,或窗口聚合 tumble/hop/session),每个窗口闭合后生成一个有限批次,方可对该窗口内结果进行排序。LIMIT n 将在返回 n 行后终止查询。 它并非“按某字段取前 N 名”,而是硬性截断。如需按窗口排名,请配合窗口子句使用 LIMIT n BY window_start,或使用流式原生 Top-K 聚合函数(top_k、min_k、max_k)。SELECT ... FROM table(stream)),ORDER BY 和 LIMIT 按常规方式工作。参见 references/TRANSFORMATIONS.md → 每窗口 Top-N 获取推荐写法。
_tp_time 列每个流都内置一个 _tp_time datetime64(3, 'UTC') 事件时间列,默认值为数据摄入时间。创建流时可通过 SETTINGS event_time_column='your_column' 设置自定义事件时间列。
| 模式 | 创建方式 | 行为 |
|---|---|---|
append |
CREATE STREAM(默认) |
不可变日志,仅允许新增行 |
versioned_kv |
+ SETTINGS mode='versioned_kv' |
按主键保留最新值 |
changelog_kv |
+ SETTINGS mode='changelog_kv' |
跟踪 Insert/Update/Delete 操作 |
mutable |
CREATE MUTABLE STREAM |
行级 UPDATE/DELETE(企业版功能) |
# 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 @-
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 @-
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 @-
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 | 改用 CREATE STREAM IF NOT EXISTS |
Unknown column |
字段名拼写错误或指定了错误的流 | 运行 DESCRIBE stream_name 查看 schema |
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.mdreferences/TRANSFORMATIONS.mdreferences/SINKS.mdreferences/SQL_REFERENCE.mdreferences/RANDOM_STREAMS.mdreferences/UDFS.mdreferences/Python_TABLE_FUNCTION.mdEMIT AFTER SESSION CLOSE / KEY EXPIRE、事件终止型会话窗口、UDAF has_customized_emit、MAXSPAN/TIMEOUT 约束 → references/EMIT_AND_UDAF.mdreferences/TASK.mdreferences/ALERT.md相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 133.9万人学习
共49课时 | 82.5万人学习