StarRocks 数学函数 SIN 详解:语法、返回值与向量化实现原理
【免费下载链接】starrocksThe world's fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks
本篇技术指南围绕 StarRocks 内置数学函数SIN展开,说明其在 SQL 查询中计算弧度制参数正弦值的用法,包括语法、参数类型、返回值与可运行的查询示例。文章同时结合当前仓库中 BE(Backend)侧的函数注册与向量化实现源码,剖析SIN在 StarRocks 内部如何被解析、编译并高效执行,帮助读者既会用它做数值计算,也能理解其底层原理。相关文档原文位于 docs/en/sql-reference/sql-functions/math-functions/sin.md。
函数功能概述
SIN是 StarRocks 提供的三角函数之一,用于计算输入参数x的正弦值(sine)。需要特别注意的是:参数x必须以弧度(radian)为单位,而非角度(degree)。例如SIN(0)返回0,SIN(pi()/2)返回1。
在 StarRocks 的 SQL 函数体系中,SIN属于数学函数(Math Function),被归入标量(Scalar)函数类别,可直接出现在SELECT投影列、WHERE过滤条件以及表达式中,与COS、TAN、ASIN、SINH等三角函数并列(这些函数在 BE 源码 be/src/exprs/math_functions.cpp 中集中实现)。
语法
SIN(x);函数名不区分大小写,即sin(x)、Sin(x)与SIN(x)等价。
参数说明
| 参数 | 说明 |
|---|---|
x | 待计算正弦值的数值,支持 DOUBLE 数据类型。传入其他数值类型(如INT、BIGINT、DECIMAL)时,StarRocks 会依据隐式类型转换规则将其转换为DOUBLE后参与计算。 |
从函数注册表看,SIN的参数类型被固定声明为DOUBLE。在 FE 侧的函数签名定义(gensrc/script/functions.py)中,其声明为:
[10050, "sin", True, False, "DOUBLE", ["DOUBLE"], "MathFunctions::sin"],各字段的含义如下:
10050:函数在 StarRocks 内置函数表中的函数 ID;"sin":函数名;- 第 3 个布尔值:
True表示支持向量化执行(Vectorized Execution); - 第 4 个布尔值:
False表示非聚合类函数; - 第一个
"DOUBLE":返回值类型为DOUBLE; ["DOUBLE"]:入参类型列表,仅接受一个DOUBLE类型参数;"MathFunctions::sin":映射到 BE 端 C++ 实现入口MathFunctions::sin。
也就是说,SIN在 StarRocks 中是一个单入参、双精度、支持向量化的纯标量函数,这决定了它既能在行式处理中工作,也能在批量列式计算中被高效执行。
返回值
返回值为DOUBLE数据类型,数值范围落在闭区间[-1, 1]内(正弦函数的数学值域)。
- 当入参为
NULL时,返回NULL(遵循 SQL 标准的三值逻辑); - 当入参为
NaN(非数值)或Infinity(无穷大)时,计算得到的结果为NaN。
使用示例
1. 文档中的基础示例
原文给出了最直接的常量计算示例:
mysql> select sin(3.14); +-----------------------+ | sin(3.14) | +-----------------------+ | 0.0015926529164868282 | +-----------------------+ 1 row in set (0.21 sec)3.14是圆周率π的两位小数近似值,因此SIN(3.14)的结果约等于SIN(π) = 0,即0.0015926529164868282这样一个接近零的极小值。这恰好说明了弧度制下该函数的数值行为:SIN的参数是弧度而不是角度。
2. 结合内置常量与四则运算
StarRocks 内置pi()函数(返回DOUBLE类型的圆周率常量,实现在 be/src/exprs/math_functions.cpp,返回M_PI),可写出更精确的示例:
mysql> select sin(pi()); +----------------------+ | sin(pi()) | +----------------------+ | 1.2246467991473532e-16 | +----------------------+ 1 row in set (0.10 sec) mysql> select sin(pi()/2); +-------------+ | sin(pi()/2) | +-------------+ | 1 | +-------------+ 1 row in set (0.10 sec)SIN(pi())的结果1.2246467991473532e-16是浮点数表示π时产生的舍入误差,数学上即为0;而SIN(pi()/2)精确等于1,是正弦函数的最大值点。
3. 对列数据进行计算
实际业务中SIN更常用于对表中某一列逐行计算:
mysql> select angle, sin(angle) from sample_angles; +-------+--------------------+ | angle | sin(angle) | +-------+--------------------+ | 0 | 0 | | 1 | 0.8414709848078965 | | -1 | -0.8414709848078965 | +-------+--------------------+ 3 rows in set (0.05 sec)从结果可以看到,SIN是奇函数,SIN(-x) = -SIN(x),且计算为**逐元素(element-wise)**进行,可无缝嵌入SELECT、WHERE、ORDER BY等任意表达式位置:
-- 筛选正弦值大于 0.5 的行 SELECT angle FROM sample_angles WHERE sin(angle) > 0.5; -- 用正弦值构造新的派生列 SELECT angle, sin(angle) * 100 AS normalized FROM sample_angles;底层实现:向量化与 NaN 防护
SIN在 BE 端的实现位于 be/src/exprs/math_functions.cpp,对应头文件声明见 be/src/exprs/math_functions.h:
DEFINE_MATH_UNARY_WITH_OUTPUT_NAN_CHECK_FN_WITH_IMPL(sin, TYPE_DOUBLE, TYPE_DOUBLE, std::sin);这一行宏展开后完成三件事:
- 内核函数:直接委托给 C++ 标准库的
std::sin,保证数值精度与标准库一致; - 类型映射:入参类型
TYPE_DOUBLE、返回类型TYPE_DOUBLE,与 FE 侧注册表 gensrc/script/functions.py 中声明的DOUBLE -> DOUBLE完全对应; - 输出 NaN 检查:宏
DEFINE_MATH_UNARY_WITH_OUTPUT_NAN_CHECK_FN(定义见 be/src/exprs/math_functions.cpp)将求值器包装为VectorizedOutputCheckUnaryFunction<sinImpl, NanCheck>,其中NanCheck(be/src/exprs/math_functions.cpp)会在每个输出值上执行std::isnan(value)检查。
这里的“向量化”是关键:StarRocks 的表达式求值采用**批量列式(vectorized)**执行模型,sin不再逐行调用函数,而是对整列数据一次性送入VectorizedStrictUnaryFunction模板求值器,通过 SIMD 友好的循环对一整个DoubleColumn计算正弦,从而大幅摊薄函数调用开销。这正是 StarRocks 能在大数据量、高并发分析场景下保持亚秒级响应的重要基础之一。
同理,COS、TAN、ASIN、ACOS、SINH、COSH、TANH等函数在源码中采用完全相同的宏模板(见 be/src/exprs/math_functions.cpp),学习SIN的实现模式即可举一反三。
使用注意事项
- 弧度制:
SIN(30)的结果是30弧度的正弦(约-0.988),并非30°的正弦。如需角度制计算,可先通过角度转弧度公式换算:SIN(angle_in_degree * pi()/180)。 - 精度边界:由于
DOUBLE是 IEEE 754 双精度浮点数,参数接近π的整数倍时,结果会呈现极小但非零的舍入误差(如示例中的SIN(3.14)),这是浮点运算的正常表现。 - NULL 与异常值:
NULL输入返回NULL;NaN/±Infinity输入经NanCheck防护后返回NaN,不会导致查询报错或 BE 进程异常。 - 与其他三角函数协同:
SIN常与COS、TAN配合完成信号处理、坐标换算、统计计算等场景;需要反函数时使用ASIN。
总结
SIN是 StarRocks 中一个接口简洁、语义明确的数学函数:以DOUBLE弧度值入参,返回DOUBLE正弦值。其背后则是一条从 FE 函数注册表(gensrc/script/functions.py)到 BE 向量化实现(be/src/exprs/math_functions.cpp)的完整链路,体现了 StarRocks“SQL 接口简单、执行引擎高效”的设计理念。无论是日常数值分析,还是深度理解 StarRocks 向量化表达式框架,SIN都是一个理想的切入点。
【免费下载链接】starrocksThe world's fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考