数据过滤与转换
# 数据过滤与转换
# 业务场景
最常见的一类需求是逐条处理——每来一条读数就过滤、换算、分级,一进一出同步返回,不涉及窗口聚合。比如:丢弃明显异常的读数(温度越界)、把摄氏换算成华氏、按温度分级标注(正常/预警/报警)。这类需求用非聚合模式的 EmitSync,调用方直接拿到单条结果。
# SQL
SELECT deviceId,
temperature,
temperature * 1.8 + 32 AS temp_f,
CASE WHEN temperature > 35 THEN 'CRITICAL'
WHEN temperature > 30 THEN 'WARNING'
ELSE 'OK' END AS level
FROM stream
WHERE temperature > 0 AND temperature < 100
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 输入
{"deviceId": "dev-01", "temperature": 28.0}
{"deviceId": "dev-02", "temperature": 32.0}
{"deviceId": "dev-03", "temperature": 38.0}
{"deviceId": "dev-04", "temperature": 999.0}
{"deviceId": "dev-05", "temperature": null}
1
2
3
4
5
2
3
4
5
# 输出
EmitSync 逐条同步返回;不命中 WHERE 的行返回 nil(不是错误):
{deviceId:dev-01 temperature:28 temp_f:82.4 level:OK}
{deviceId:dev-02 temperature:32 temp_f:89.6 level:WARNING}
{deviceId:dev-03 temperature:38 temp_f:100.4 level:CRITICAL}
[filtered] dev-04 // 999 越界,被 BETWEEN 拦掉
[filtered] dev-05 // null,被 IS NOT NULL 拦掉
1
2
3
4
5
2
3
4
5
# 行为说明
EmitSync只用于非聚合查询(无GROUP BY/窗口);对聚合查询调用会报错synchronous mode only supports non-aggregation queries。WHERE过滤原始行:不满足条件的行返回nil,可据此区分"被过滤"和"出错"。要在聚合后再过滤用HAVING(见滑动窗口与持续检测)。- 算术与别名:
temperature * 1.8 + 32 AS temp_f直接写表达式并起别名,无需注册 UDF。 CASE WHEN:做分级标注/条件赋值;WHERE支持比较(>、<、=)、AND/OR组合多条件。
如何运行
非聚合查询用 EmitSync(data) 同步拿单条结果,无需 AddSink。完整样板见如何运行案例 SQL。
# 📚 相关文档
- 如何运行案例 SQL
- SQL 参考 —— WHERE、表达式、CASE
- IoT 温度告警与指标聚合 —— 从单点转换升级到窗口聚合
在 GitHub 上编辑此页 (opens new window)
上次更新: 2026/07/11, 04:40:00