【免费下载链接】beamApache Beam is a unified programming model for Batch and Streaming data processing.项目地址https://gitcode.com/gh_mirrors/beam18/beam点击查看免费下载Apache Beam 的 Calcite SQL 方言Beam Calcite SQL是 Beam SQL 的默认方言它基于 Apache Calcite 的 SQL 语法模型并针对 Beam 的统一批处理/流处理模型做了增强。本文以仓库中的官方参考文档 scalar-functions.md 为骨架完整梳理 Beam Calcite SQL 支持的比较、逻辑、算术、数学、日期、字符串与条件函数并结合sdks/java/extensions/sql的源码实现与集成测试说明这些标量函数在查询计划阶段如何被解析、注册与执行。读完本文你将能准确判断每条 SQL 表达式在 Beam Calcite SQL 中是否可用、语义是什么以及如何在自己的 Beam 管道中直接使用这些函数。背景Beam Calcite SQL 与标量函数的位置Apache Calcite 是广泛应用于大数据处理领域、带有流式增强的 SQL 方言。Beam 将 Calcite 作为默认 SQL 方言见 overview.md这意味着当你在SqlTransform.query(...)中书写 SQL 时默认就运行在 Beam Calcite SQL 之上。标量函数scalar functions作用于单行输入并返回单值结果是 SQL 表达式的基本构件覆盖了从字段过滤、数值计算到日期提取与字符串加工的几乎所有场景。从官方支持矩阵可以看到 Beam Calcite SQL 在函数覆盖上的取舍支持比较运算符、逻辑运算符、算术运算符与函数、字符串运算符与函数、日期/时间函数、条件函数、类型转换、数组值构造器、分组辅助函数除SESSION_END外等不支持二进制字符串函数、系统函数、集合函数、Period 谓词、JDBC 函数转义、窗口函数、分组函数、空间函数、JSON 函数、MATCH_RECOGNIZE等。聚合函数aggregate functions与窗口/触发windowing and triggering属于 Beam SQL 的扩展能力分别参见 aggregate-functions.md 与 windowing-and-triggering.md。本文聚焦标量函数本身。比较函数与运算符比较运算用于判断两个值之间的关系返回布尔结果。Beam Calcite SQL 支持标准的六种比较运算符以及针对 NULL 的判定运算符语法说明value1 value2等于value1 value2不等于value1 value2大于value1 value2大于或等于value1 value2小于value1 value2小于或等于value IS NULLvalue 是否为 nullvalue IS NOT NULLvalue 是否不为 null在实现上比较运算符来自 Calcite 的标准运算符表SqlStdOperatorTable。查询计划器 CalciteQueryPlanner.java 在构建FrameworkConfig时通过SqlOperatorTables.chain(opTab0, catalogReader)将SqlStdOperatorTable.instance()与 Beam 的 catalog 运算符链式拼接从而同时支持标准 Calcite 运算符和 Beam 注册的内建函数。注意 NULL 语义在 SQL 三值逻辑下任何与 NULL 参与的比较运算结果既不是 TRUE 也不是 FALSE而是 UNKNOWN。因此在 Beam 管道中做过滤时应显式使用IS NULL/IS NOT NULL处理空值。逻辑函数与运算符逻辑运算遵循 SQL 的三值逻辑TRUE / FALSE / UNKNOWN运算符语法说明boolean1 OR boolean2boolean1 为 TRUE 或 boolean2 为 TRUEboolean1 AND boolean2boolean1 与 boolean2 均为 TRUENOT booleanboolean 不为 TRUE若 boolean 为 UNKNOWN 则返回 UNKNOWN其中OR/AND/NOT均来自 Calcite 标准运算符表。需要特别强调的是NOT的 UNKNOWN 传播行为当输入为 NULLUNKNOWN时NOT boolean仍返回 UNKNOWN而非 TRUE。仓库的集成测试 BeamSqlLogicalFunctionsIntegrationTest.java 对这类三值逻辑场景有专门覆盖。算术表达式运算符语法说明numeric1 numeric2返回 numeric1 加 numeric2numeric1 - numeric2返回 numeric1 减 numeric2numeric1 * numeric2返回 numeric1 乘以 numeric2numeric1 / numeric2返回 numeric1 除以 numeric2MOD(numeric, numeric)返回 numeric1 除以 numeric2 的余数模仅当 numeric1 为负数时结果才为负数几个值得注意的语义细节与多数 SQL 方言一致整型相除1 / 2的结果是 0整数除法截断需要小数结果时应使用浮点或DECIMAL类型参与运算MOD的符号规则由被除数numeric1决定MOD(-7, 3)结果为 -1而MOD(7, -3)结果为 1。这与 Java 的%运算符语义一致除零在运行时会产生错误如ArithmeticException/DataException在流式管道中应通过过滤条件提前规避。数学函数运算符语法说明ABS(numeric)返回 numeric 的绝对值SQRT(numeric)返回 numeric 的平方根LN(numeric)返回 numeric 的自然对数以 e 为底LOG10(numeric)返回 numeric 的以 10 为底的对数EXP(numeric)返回 e 的 numeric 次幂ACOS(numeric)返回 numeric 的反余弦ASIN(numeric)返回 numeric 的反正弦ATAN(numeric)返回 numeric 的反正切COT(numeric)返回 numeric 的余切DEGREES(numeric)将 numeric 从弧度转换为角度RADIANS(numeric)将 numeric 从角度转换为弧度SIGN(numeric)返回 numeric 的符号函数值signumSIN(numeric)返回 numeric 的正弦TAN(numeric)返回 numeric 的正切ROUND(numeric1, numeric2)将 numeric1 四舍五入到小数点右侧 numeric2 位这些三角函数、对数函数与取整函数大多由 Calcite 标准运算符表直接提供。除此之外Beam 还通过BeamBuiltinFunctionProvider机制注册了一批额外数学内建函数。例如 BuiltinTrigonometricFunctions.java 以UDF注解注册了COSH、SINH、TANH三个双曲函数参数与返回值均为DOUBLE类型实现直接委托给java.lang.MathUDF( funcName COSH, parameterArray {Schema.TypeName.DOUBLE}, returnType Schema.TypeName.DOUBLE) public Double cosh(Double o) { if (o null) { return null; } return Math.cosh(o); }从实现可以看到 Beam 对 NULL 的显式处理任何Strict之外的手写函数都会自行判断空输入并返回 NULL保证与 SQL 的三值语义一致。IsInf.java、IsNan.java则提供了IS_INF/IS_NAN这类面向浮点特殊值判定的辅助函数位于同一impl/udf目录。ROUND(numeric1, numeric2)的第二个参数控制保留的小数位数当 numeric2 为 0 时即四舍五入到整数。实际精度受输入类型影响DECIMAL输入按 BigDecimal 语义舍入浮点输入则按 IEEE 754 双精度浮点规则处理。日期函数日期/时间函数在 Beam Calcite SQL 中按 Calcite 的日期语义实现。当前时间类函数均基于会话时区session time zone求值运算符语法说明LOCALTIME返回会话时区下的当前日期与时间类型为 TIMELOCALTIME(precision)返回会话时区下的当前日期与时间类型为 TIME保留 precision 位精度LOCALTIMESTAMP返回会话时区下的当前日期与时间类型为 TIMESTAMPLOCALTIMESTAMP(precision)返回会话时区下的当前日期与时间类型为 TIMESTAMP保留 precision 位精度CURRENT_TIME返回会话时区下的当前时间类型为 TIMESTAMP WITH TIME ZONECURRENT_DATE返回会话时区下的当前日期类型为 DATECURRENT_TIMESTAMP返回会话时区下的当前日期与时间类型为 TIMESTAMP WITH TIME ZONEEXTRACT(timeUnit FROM datetime)从 datetime 值表达式中提取并返回指定时间字段的值FLOOR(datetime TO timeUnit)将 datetime 向下舍入到 timeUnitCEIL(datetime TO timeUnit)将 datetime 向上舍入到 timeUnitYEAR(date)等价于 EXTRACT(YEAR FROM date)返回整数QUARTER(date)等价于 EXTRACT(QUARTER FROM date)返回 1 到 4 的整数MONTH(date)等价于 EXTRACT(MONTH FROM date)返回 1 到 12 的整数WEEK(date)等价于 EXTRACT(WEEK FROM date)返回 1 到 53 的整数DAYOFYEAR(date)等价于 EXTRACT(DOY FROM date)返回 1 到 366 的整数DAYOFMONTH(date)等价于 EXTRACT(DAY FROM date)返回 1 到 31 的整数DAYOFWEEK(date)等价于 EXTRACT(DOW FROM date)返回 1 到 7 的整数HOUR(date)等价于 EXTRACT(HOUR FROM date)返回 0 到 23 的整数MINUTE(date)等价于 EXTRACT(MINUTE FROM date)返回 0 到 59 的整数SECOND(date)等价于 EXTRACT(SECOND FROM date)返回 0 到 59 的整数几个关键用法EXTRACT的timeUnit支持YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、QUARTER、WEEK、DOYday of year、DOWday of week等标准单位FLOOR/CEIL常用于时间粒度规整例如FLOOR(rowtime TO HOUR)可将时间戳对齐到小时边界是流式窗口聚合前的常用预处理便捷函数YEAR(date)、MONTH(date)等均为EXTRACT的语法糖返回INTEGER且各字段的取值范围如上表所列例如SECOND恒在 059 之间。仓库的集成测试 BeamSqlDateFunctionsIntegrationTest.java 中保留了针对LOCALTIME、LOCALTIMESTAMP、CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP的查询用例该用例目前标记了Ignore对应 Apache Beam issue #20339测试数据构造基于org.joda.time.DateTime。日期字段在 Beam 中的类型映射可参考>UDF( funcName LPAD, parameterArray {TypeName.STRING, TypeName.INT64, TypeName.STRING}, returnType TypeName.STRING) Strict public String lpad(String originalValue, Long returnLength, String pattern) { if (returnLength -1 || pattern.isEmpty()) { throw new IllegalArgumentException(returnLength cannot be 0 or pattern cannot be empty.); } if (originalValue.length() returnLength) { return originalValue; } else if (originalValue.length() returnLength) { // 左侧填充 return StringUtils.leftPad(originalValue, Math.toIntExact(returnLength), pattern); } else { // 截断到目标长度 return originalValue.substring(0, Math.toIntExact(returnLength)); } }可见LPAD(str, n, pat)在str长度小于 n 时左侧重复填充pat直至达到 n 个字符在大于 n 时直接截断。Strict注解来自 Calcite linq4j保证输入为 NULL 时函数整体返回 NULL无需手写判空。此外 BuiltinHashFunctions.java 还提供了MD5、SHA1等哈希函数STRING/BYTES重载返回BYTES可配合TO_HEX得到常见的十六进制摘要串。条件函数运算符语法说明CASE valueWHEN value1 [, value11 ]* THEN result1[ WHEN valueN [, valueN1 ]* THEN resultN ]*[ ELSE resultZ ]END简单 CASECASEWHEN condition1 THEN result1[ WHEN conditionN THEN resultN ]*[ ELSE resultZ ]END搜索 CASENULLIF(value, value)两个值相同则返回 NULL。例如 NULLIF(5, 5) 返回 NULLNULLIF(5, 0) 返回 5COALESCE(value, value [, value ]*)当第一个值为 NULL 时提供替代值。例如 COALESCE(NULL, 5) 返回 5CASE的两种形式简单 CASE 与搜索 CASE分别用于值等值分派与条件分支两种场景NULLIF(a, b)等价于CASE WHEN a b THEN NULL ELSE a END常用于将特定哨兵值如 0、空串转为 NULLCOALESCE则按参数顺序返回第一个非 NULL 值是空值兜底的惯用写法例如COALESCE(discount, 0)可将缺失折扣视为 0。源码视角标量函数如何被注册与解析理解这些函数在 Beam 中的落地方式有助于判断某个 Calcite 函数在 Beam 里到底能不能用。整体机制位于sdks/java/extensions/sql模块标准运算符CalciteQueryPlanner在构建FrameworkConfig时将SqlStdOperatorTable.instance()加入运算符表因此 Calcite 原生支持的所有标准运算符与函数本文表格中绝大多数条目开箱即用Beam 内建扩展函数通过 Java 的ServiceLoader机制加载所有BeamBuiltinFunctionProvider实现见 CalciteQueryPlanner.java。每个 provider如BuiltinStringFunctions、BuiltinTrigonometricFunctions、BuiltinHashFunctions通过AutoService(BeamBuiltinFunctionProvider.class)注册其中的每个方法用UDF注解声明函数名、参数类型数组与返回类型见 UDF.java。BeamBuiltinFunctionProvider.getBuiltinMethods()会将所有带UDF注解的方法按funcName分组随后UdfImpl.create(method)将每个方法包装成可被 Calcite 调用的函数对象并加入当前 schema解析与转换convertToBeamRel()完成 parse → validate → rel → 物理计划转换的完整链路最终将 SQL 表达式树转换为 Beam 的关系表达式BeamRelNode。需要说明的是Beam Calcite 方言目前不支持查询参数convertToBeamRel中对Kind.NONE之外的参数会直接抛出IllegalArgumentException因此动态值请以字符串拼接或 UDF 方式处理。实战在管道中使用这些函数标量函数只有在实际查询中才有意义。使用方式遵循 Beam SQL 的统一入口SqlTransform.query(...)详见 walkthrough.md对单个PCollection应用查询时集合在 SQL 中固定以表名PCOLLECTION引用对PCollectionTuple应用查询时各子集合以TupleTag作为表名引用。一个综合使用比较、数学、日期与字符串函数的示例PCollectionRow result input.apply( SqlTransform.query( SELECT appId, UPPER(description) AS desc_upper, ROUND(rating, 1) AS rating_rounded, YEAR(rowtime) AS event_year, SUBSTRING(description FROM 1 FOR 10) AS head, COALESCE(category, unknown) AS category FROM PCOLLECTION WHERE rating 4.0 AND appId IS NOT NULL));结合前面各节该查询展示了比较运算、逻辑运算AND、IS NOT NULL判定、数学函数ROUND、日期函数YEAR、字符串函数UPPER/SUBSTRING以及条件函数COALESCE的组合使用。更完整的可运行示例可参考仓库中的 BeamSqlExample.java 与 BeamSqlPojoExample.java。这些示例展示了如何为输入PCollection注册 Schema、如何用Create.of(...).withCoder(RowCoder.of(schema))构造测试数据以及如何在PCollectionTuple上执行带 JOIN 与 GROUP BY 的查询。验证与边界仓库中的集成测试是验证函数行为的第一手资料BeamSqlBuiltinFunctionsIntegrationTestBase.java 定义了覆盖BYTE/INT16/INT32/INT64/FLOAT/DOUBLE/DECIMAL/DATETIME等类型的测试表结构含可空变体并用TestBoundedTable构造输入行各测试子类如BeamSqlLogicalFunctionsIntegrationTest、BeamSqlDateFunctionsIntegrationTest通过SqlTransform.query(...)结合PAssert断言结果。使用标量函数时还需注意 Beam Calcite SQL 的边界不支持的函数族二进制字符串函数、系统函数、集合函数、JSON 函数、窗口函数、空间函数等均不受支持详见 overview.md 的支持矩阵NULL 语义除IS NULL/IS NOT NULL与COALESCE外NULL 参与运算通常传播为 NULL逻辑运算遵循三值逻辑类型映射各标量函数接受的参数类型需与>赞分享【免费下载链接】beamApache Beam is a unified programming model for Batch and Streaming data processing.项目地址https://gitcode.com/gh_mirrors/beam18/beam点击查看免费下载相关推荐Apache Beam Calcite SQL 标量函数参考与实践指南Apache Beam Calcite SQL 标量函数参考与实践指南 Apache Beam 将 SQL 作为其统一批/流处理模型之上的声明式查询层而 Be大数据批处理流处理数据工程DataFusion SQL 运算符与字面量完全指南从算术、比较到正则与 E 风格字符串DataFusion SQL 运算符与字面量完全指南从算术、比较到正则与 E 风格字符串 本文基于 Apache DataFusion 官方用户文档 docs大数据数据分析后端Xous输入法引擎IME多语言输入支持的架构设计Xous输入法引擎IME多语言输入支持的架构设计 Xous微内核的输入法引擎IME是一套功能强大的多语言输入解决方案通过模块化设计实现了灵活的输入预测、操作系统嵌入式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考