
StarRocks 数学函数 ln / dlog1 / log自然对数计算的语法、边界行为与向量化实现解析【免费下载链接】starrocksThe worlds 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 内置数学函数ln及其等效写法dlog1、log展开说明其语法、参数类型、NULL 边界行为与典型 SQL 示例并结合 BE 端向量化表达式引擎的源码实现解释自然对数在 StarRocks 中是如何被计算、校验与返回的。读完本文你将能够在 StarRocks 中正确、高效地使用自然对数函数处理 DOUBLE 类型数值并理解其底层实现原理。函数概览ln、dlog1、log是 StarRocks 中计算自然对数以自然常数e为底的对数的数学函数三者功能完全等价只是名称不同。原始文档见 docs/en/sql-reference/sql-functions/math-functions/ln.md在 FE 端函数目录中统一注册为ln、dlog1等名称见 FunctionSet.java。语法ln(arg) log(arg) dlog1(arg)三种写法均接受一个参数arg并返回该参数的自然对数。参数与返回值项目说明参数arg需要计算对数的数值仅支持 DOUBLE 数据类型返回值DOUBLE 数据类型边界行为当arg为负数或 0 时函数返回NULL注意由于arg仅支持 DOUBLE其他数值类型如 INT、BIGINT、DECIMAL在调用时会被隐式转换为 DOUBLE 后再参与计算。边界行为负数与 0 返回 NULL对数函数在数学上的定义域为正实数。当arg为负数或 0 时ln/dlog1/log不会抛出错误而是返回NULL。这一行为由 BE 端向量化引擎的输入检查机制保证在 be/src/exprs/math_functions.cpp 中ln通过宏DEFINE_MATH_UNARY_WITH_NON_POSITIVE_CHECK_FN_WITH_IMPL定义底层计算使用 C 标准库的std::logDEFINE_MATH_UNARY_WITH_NON_POSITIVE_CHECK_FN_WITH_IMPL(ln, TYPE_DOUBLE, TYPE_DOUBLE, std::log);该宏展开后见 math_functions.cpp 宏定义使用VectorizedInputCheckUnaryFunctionlnImpl, NonPositiveCheck即非正值检查NonPositiveCheck——当输入值v 0时直接输出 NULL而不会将-1、0等非法值送入std::log产生 NaN 或无穷大等非预期结果#define DEFINE_MATH_UNARY_WITH_NON_POSITIVE_CHECK_FN(NAME, TYPE, RESULT_TYPE) \ StatusOrColumnPtr MathFunctions::NAME(FunctionContext* context, const Columns columns) { \ using VectorizedUnaryFunction VectorizedInputCheckUnaryFunctionNAME##Impl, NonPositiveCheck; \ return VectorizedUnaryFunction::evaluateTYPE, RESULT_TYPE(VECTORIZED_FN_ARGS(0)); \ }从源码结构可以看出StarRocks 的数学函数通过不同的输入/输出检查模板区分行为检查策略宏名称适用函数示例非正值检查 0返回 NULLDEFINE_MATH_UNARY_WITH_NON_POSITIVE_CHECK_FNln、log10负值检查 0返回 NULLDEFINE_MATH_UNARY_WITH_NEGATIVE_CHECK_FNsqrt输出 NaN 检查DEFINE_MATH_UNARY_WITH_OUTPUT_NAN_CHECK_FNsin、cos、tan等输出 Inf/NaN 检查DEFINE_MATH_UNARY_WITH_OUTPUT_INF_NAN_CHECK_FNexp示例示例 1计算 3 的自然对数mysql select ln(3); -------------------- | ln(3) | -------------------- | 1.0986122886681098 | -------------------- 1 row in set (0.00 sec) mysql select dlog1(3); -------------------- | dlog1(3) | -------------------- | 1.0986122886681098 | -------------------- 1 row in set (0.00 sec) mysql select log(3); -------------------- | log(3) | -------------------- | 1.0986122886681098 | -------------------- 1 row in set (0.00 sec)三种写法输出完全一致均为1.0986122886681098验证了dlog1、log与ln的等价性。示例 2结合列数据进行计算-- 对表中数值列计算自然对数 SELECT ln(score) FROM exam_scores; -- 与聚合等表达式组合使用 SELECT ln(SUM(amount)) AS log_total FROM orders;与相关对数函数族的区别StarRocks 还提供其他底数的对数函数注意不要与单参数的自然对数混淆函数含义底层实现ln(arg)/dlog1(arg)/log(arg)自然对数底数estd::log(v)log(base, arg)任意底数的对数返回log(arg) / log(base)见下方说明log2(arg)以 2 为底的对数std::log(v) / std::log(2.0)log10(arg)/dlog10(arg)以 10 为底的对数std::log10(v)其中双参数版本log(base, arg)与单参数自然对数log(arg)在 StarRocks 中是不同的函数重载。双参数版本在 math_functions.cpp 中实现其合法性检查更为严格——当base 0、|base - 1| EPSILON底数近似为 1、v 0或v为 NaN 时返回 NULLDEFINE_BINARY_FUNCTION_WITH_IMPL(logProduceNullImpl, base, v) { return std::isnan(v) || base 0 || std::fabs(base - 1.0) MathFunctions::EPSILON || v 0.0; } DEFINE_BINARY_FUNCTION_WITH_IMPL(logImpl, base, v) { return (double)(std::log(v) / std::log(base)); }因此在实际使用时需注意log(x)单参数等价于ln(x)计算自然对数log(base, x)双参数计算以base为底、x的对数双参数log要求base大于 0 且不等于 1否则返回 NULL。从 SQL 到向量化执行的实现链路ln等函数在 StarRocks 中的完整执行链路可概括为FE 端注册函数名称在 FunctionSet.java 中以常量形式注册LN ln、DLOG1 dlog1、LOG log供 SQL 解析与优化器识别与重载匹配。BE 端向量化求值ln被编译为MathFunctions::ln通过VectorizedInputCheckUnaryFunction模板对整列数据批量执行输入检查 std::log计算充分利用 SIMD 与列式内存布局获得高性能。NULL 语义透传NonPositiveCheck保证负数和 0 输入在进入数学库前即被标记为 NULL符合 SQL 标准的三值逻辑TRUE/FALSE/NULL也解释了本文开头负数或 0 返回 NULL的文档行为。此外在 ODBC 标量函数兼容层中log、log10被列入 ODBC 数字标量函数映射表见 OdbcScalarFunctionCall.java意味着通过 ODBC 驱动接入的外部工具也可以直接使用这些对数函数无需改写 SQL。总结ln(arg)、dlog1(arg)、log(arg)三者等价均计算以e为底的自然对数参数仅支持 DOUBLE返回 DOUBLE当arg为负数或 0 时返回NULL而非报错或返回 NaN/InfBE 端通过std::log结合NonPositiveCheck输入校验实现保证列式批处理下的正确性与高性能与log(base, arg)、log2、log10组成完整的对数函数族可按需选用。如需查看完整的数学函数列表与更多对数用法可继续阅读仓库中的 数学函数文档目录 及 BE 端实现 math_functions.cpp 与声明 math_functions.h。【免费下载链接】starrocksThe worlds 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),仅供参考