You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark DataFrame列正则提取:提取括号内首个分组目标值

解决方案

要实现从SQL语句中提取目标字段field1,我们可以利用Spark的regexp_extract函数结合精准的正则表达式来完成。针对你给出的SQL示例,核心是定位到嵌套在sum()函数内的字段名,以下是完整的实现代码:

import org.apache.spark.sql.functions.{col, regexp_extract}

// 假设你的原始DataFrame名为df,其中存储SQL语句的列名为sql_query
val df1 = df.withColumn("Extract_field", regexp_extract(col("sql_query"), "sum\\(([^)]+)\\)", 1))

代码说明

  1. 依赖导入:先导入Spark SQL的col和regexp_extract函数,前者用于指定目标列,后者负责执行正则提取操作。
  2. 正则表达式解析:
    • sum\\(:匹配sum((括号在正则中是特殊字符,需要用反斜杠转义)
    • ([^)]+):定义第一个捕获分组,匹配任意非右括号的字符,刚好对应sum()内部的field1
    • \\):匹配右括号,闭合sum()的结构
  3. 函数参数:regexp_extract的第三个参数1表示提取第一个捕获分组的内容,也就是我们想要的field1。

更通用的扩展(适配更多函数场景)

如果你的SQL中可能出现其他聚合函数(比如avg、count),可以把正则表达式修改为更通用的版本,匹配任意函数名后的内层字段:

val df1 = df.withColumn("Extract_field", regexp_extract(col("sql_query"), "\\w+\\(([^)]+)\\)", 1))

这个正则会匹配第一个形如func(field)的结构,提取其中的field部分。

注意事项

  • 如果你的SQL语句中存在更复杂的多层嵌套括号(比如sum(nvl(field1, 0))),可能需要调整正则表达式来适配,但针对你给出的示例,上述正则已经完全适用。
  • 请确保代码中使用的列名和你的DataFrame实际列名一致,示例中我用sql_query作为存储SQL的列名,你需要替换为自己的列名。

内容的提问来源于stack exchange,提问作者tkumaran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:07:07