如何在Hive/Spark中将字符串或整数末尾的负号移至开头?
解决Hive/Spark中字符串/整数末尾负号移至开头的问题
我来帮你搞定这个需求的实现,不管是Spark SQL还是Hive都能轻松处理~先梳理下你现有代码的小问题,再给出更简洁可靠的写法:
你现有代码的小细节问题
- 列名
YTTLSVAL-里的减号大概率是输入笔误,建议改成合法列名(比如YTTLSVAL),避免语法解析报错 substr(YTTLSVAL-,-1,1)可以简化成substr(YTTLSVAL, -1),Spark SQL中substr的第三个长度参数可选,取最后一个字符时无需额外指定- 用
right函数替代substr取最后一个字符,代码可读性会更强
正确的Spark SQL实现
下面两种写法都能完美实现把末尾负号移到开头的需求:
写法1:使用right和left函数(可读性拉满)
SELECT CASE -- 判断字符串最后一位是否为负号 WHEN right(YTTLSVAL, 1) = '-' THEN -- 拼接负号和原字符串去掉最后一位的部分,再转成整数 cast(concat('-', left(YTTLSVAL, length(YTTLSVAL)-1)) AS int) ELSE -- 正常格式的字符串直接转整数 cast(YTTLSVAL AS int) END AS column_name FROM your_table_name
写法2:使用substr函数(习惯用substr的话可选)
SELECT CASE WHEN substr(YTTLSVAL, -1) = '-' THEN cast(concat('-', substr(YTTLSVAL, 1, length(YTTLSVAL)-1)) AS int) ELSE cast(YTTLSVAL AS int) END AS column_name FROM your_table_name
Hive中的实现
Hive的语法和Spark SQL基本一致,上述两种写法都可以直接在Hive中使用,因为Hive同样支持right、left和substr函数:
SELECT CASE WHEN right(YTTLSVAL, 1) = '-' THEN cast(concat('-', substr(YTTLSVAL, 1, length(YTTLSVAL)-1)) AS int) ELSE cast(YTTLSVAL AS int) END AS column_name FROM your_table_name
额外优化:处理异常值
如果你的数据里有空值、非数字字符串这类异常情况,可以用TRY_CAST替代CAST,这样转换失败时不会抛出错误,而是返回NULL:
SELECT CASE WHEN right(YTTLSVAL, 1) = '-' THEN try_cast(concat('-', left(YTTLSVAL, length(YTTLSVAL)-1)) AS int) ELSE try_cast(YTTLSVAL AS int) END AS column_name FROM your_table_name
内容的提问来源于stack exchange,提问作者Naveed Navaz




