编写并执行 Timeplus 流式 SQL 以进行实时分析。在用户需要创建流、运行流式查询、构建物化视图等场景时使用此技能。
Timplus Streaming SQL Guide. 你是Timplus的专家——高性能实时流分析器.
功能概述
Timplus Streaming SQL Guide. 你是Timplus的专家——高性能实时流分析器.是一项面向实际任务的技能,主要用于Platform 建在流式SQL引擎(Proton)上.;You write 正确,高效.;
核心要点
- Time.。
- 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
- 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
使用与执行
该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
结果检查与注意事项
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
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 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 @-
通过 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= 参数:
| 格式 | 适用场景 |
|---|---|
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_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:建流 → 插入 → 查询
# 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 | 改用 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.md - 窗口函数、JOIN、CTE、物化视图、聚合操作 →
references/TRANSFORMATIONS.md - 输出目标(Sinks)、外部表、Kafka 输出、Webhook →
references/SINKS.md - 数据类型、完整函数列表、查询设置、全部 DDL 语句 →
references/SQL_REFERENCE.md - 数据模拟、随机流、测试数据生成 →
references/RANDOM_STREAMS.md - 编写 Python UDF、JavaScript UDF、远程 UDF、SQL Lambda →
references/UDFS.md - Python 表函数 →
references/Python_TABLE_FUNCTION.md - EMIT 子句语法、
EMIT AFTER SESSION CLOSE/KEY EXPIRE、事件终止型会话窗口、UDAFhas_customized_emit、MAXSPAN/TIMEOUT约束 →references/EMIT_AND_UDAF.md - 定时任务 →
references/TASK.md - 告警 →
references/ALERT.md
热门AI工具
相关专题
本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。
0
2026.10.22
本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。
0
2026.10.22
本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。
0
2026.10.22
本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。
0
2026.10.22
本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。
0
2026.10.22
本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。
0
2026.10.22
本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。
0
2026.10.22
PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。
0
2026.10.22
热门下载
相关下载
精品课程
共6课时 | 12.1万人学习
共79课时 | 161.5万人学习
共6课时 | 54.7万人学习
最新文章
