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 ), '' )
逻辑说明:
split(...):用正则断言分割字符串,将单词和分隔符拆分为独立数组元素(例如['new', '-', 'york', ',', 'los', ' ', 'angeles'])transform(...):遍历数组,对单词(匹配\w+)执行首字母大写、其余字母小写;对分隔符直接保留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
相关产品推荐
相关产品推荐

