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

如何在SparkSQL中使用正则表达式提取表中数据的数字

解决方案:提取JSON字符串中的数值并格式化输出

针对你的需求,需要从actual_result列的JSON字符串中提取所有数值,格式化为(数字1,数字2)或(数字)的形式,以下是两种可行的解决方法:

方法一:使用正则表达式快速提取

这种方法简单直接,通过正则替换过滤掉所有非数字和逗号的字符,再拼接成目标格式:

sql_df = spark.sql("""
    SELECT 
        actual_result,
        CONCAT('(', REGEXP_REPLACE(actual_result, '[^\\d,]', ''), ')') AS formatted_result
    FROM schema.table
""")
sql_df.show(10, 0)

原理说明:

  • REGEXP_REPLACE(actual_result, '[^\\d,]', ''):匹配所有非数字(\\d)和非逗号的字符,将其替换为空,只保留数字和分隔用的逗号
  • CONCAT('(', ..., ')'):把提取出的数字串包裹成(x,y)或(x)的格式

方法二:使用JSON解析函数(更严谨)

如果需要严格区分JSON中的数值类型,避免误匹配(比如JSON字符串中包含数字格式的键名),可以用Spark的JSON解析函数将字符串转为Map,再提取数值:

sql_df = spark.sql("""
    SELECT 
        actual_result,
        CASE
            -- 过滤出所有纯数字的value,再拼接格式
            WHEN size(filtered_values) > 0 THEN CONCAT('(', CONCAT_WS(',', filtered_values), ')')
            ELSE '()'
        END AS formatted_result
    FROM (
        SELECT 
            actual_result,
            -- 解析JSON为string类型的Map,过滤出值为纯数字的项
            filter(map_values(from_json(actual_result, map<string, string>)), x -> x RLIKE '^\\d+$') AS filtered_values
        FROM schema.table
    ) t
""")
sql_df.show(10, 0)

原理说明:

  • from_json(actual_result, map<string, string>):将JSON字符串解析为键值对均为字符串的Map,兼容所有JSON结构
  • filter(map_values(...), x -> x RLIKE '^\\d+$'):从Map的所有值中筛选出纯数字的字符串
  • CONCAT_WS(',', filtered_values):将筛选出的数字用逗号连接,再包裹成目标格式

为什么你之前的代码返回空值?

你使用的REGEXP_EXTRACT(actual_result, '\\d+')只会提取第一个匹配的数字,若存在转义问题(比如Python字符串中\\d未正确传递给Spark SQL),或部分行的数字被特殊字符包裹导致匹配失败,就会返回空值。此外,该方法也无法满足你提取所有数字并拼接成(0,0)格式的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:46:07