You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Hive/Spark中将字符串或整数末尾的负号移至开头?

解决Hive/Spark中字符串/整数末尾负号移至开头的问题

我来帮你搞定这个需求的实现,不管是Spark SQL还是Hive都能轻松处理~先梳理下你现有代码的小问题,再给出更简洁可靠的写法:

你现有代码的小细节问题

  • 列名YTTLSVAL-里的减号大概率是输入笔误,建议改成合法列名(比如YTTLSVAL),避免语法解析报错
  • substr(YTTLSVAL-,-1,1)可以简化成substr(YTTLSVAL, -1),Spark SQL中substr的第三个长度参数可选,取最后一个字符时无需额外指定
  • right函数替代substr取最后一个字符,代码可读性会更强

正确的Spark SQL实现

下面两种写法都能完美实现把末尾负号移到开头的需求:

写法1:使用rightleft函数(可读性拉满)

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同样支持rightleftsubstr函数:

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

火山引擎 最新活动