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

Spark SQL替换参数中字符串函数失效问题求助

问题分析

你之前的写法无效,核心原因是upper('$1')是对字符串字面量'$1'执行大写转换,而非正则捕获的分组内容。Spark SQL的regexp_replace替换参数是字符串常量,无法直接在其中嵌套函数处理分组值,因此替换后原字符串未发生变化。


解决方案

方案1:处理任意分隔符(保留原分隔符)

如果需要处理包含空格、-、,等多种分隔符的字符串,且要保留原分隔符,可通过split+transform+array_join组合实现:

SELECT array_join(
    transform(
        split('new-YORK,los ANGELES', '(?<=\\W)|(?=\\W)'),
        x -> CASE WHEN x RLIKE '\\w+' THEN concat(upper(substr(x, 1, 1)), lower(substr(x, 2))) ELSE x END
    ),
    ''
)

逻辑说明:

  1. split(...):用正则断言分割字符串,将单词和分隔符拆分为独立数组元素(例如['new', '-', 'york', ',', 'los', ' ', 'angeles'])
  2. transform(...):遍历数组,对单词(匹配\w+)执行首字母大写、其余字母小写;对分隔符直接保留
  3. array_join(...):将处理后的数组拼接回完整字符串

方案2:仅处理空格分隔的字符串(简化写法)

如果只需要处理空格分隔的字符串,可使用以下简洁写法:

SELECT array_join(
    transform(split('new YORK', ' '), x -> concat(upper(substr(x, 1, 1)), lower(substr(x, 2)))),
    ' '
)

方案3:单一非空格分隔符场景(快速实现)

如果字符串仅使用一种非空格分隔符(比如全是-或,),可先将分隔符替换为空格,用initcap处理后再替换回原分隔符:

-- 处理以-分隔的字符串
SELECT regexp_replace(initcap(regexp_replace('new-york', '-', ' ')), ' ', '-')

-- 处理以,分隔的字符串
SELECT regexp_replace(initcap(regexp_replace('new,york', ',', ' ')), ' ', ',')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:27:11