Hive中将科学计数法字符串转换为8位标准数字格式的问题求解
报错原因
CASE WHEN语句要求所有分支的返回值类型一致,你的写法中满足条件的分支返回DECIMAL数值类型,ELSE分支返回STRING类型的原始字段,触发了类型不兼容错误。
修复方案
统一两个分支的返回类型,最终输出8位数字格式的字符串,参考写法如下:
,CASE WHEN m_number LIKE '%E7' -- 处理科学计数法:转数值计算后转字符串,补前导零到8位 THEN LPAD(CAST(CAST(REPLACE(m_number, 'E7', '') AS DECIMAL(20,10)) * 10000000 AS BIGINT), 8, '0') ELSE -- 原生数字串统一补前导零到8位 LPAD(m_number, 8, '0') END AS m_clean
逻辑说明
- 所有分支最终返回STRING类型,从根源解决类型不匹配问题
- 科学计数法处理时选择精度足够的DECIMAL类型,避免小数截断或数值溢出
- 用
LPAD函数统一补前导零到8位,兼容位数不足的异常数据 - 若业务不需要前导零,只需要纯数字字符串,可使用如下简化写法:
,CAST( CASE WHEN m_number LIKE '%E7' THEN CAST(REPLACE(m_number, 'E7', '') AS DECIMAL(20,10)) * 10000000 ELSE CAST(m_number AS BIGINT) END AS STRING ) AS m_clean
内容的提问来源于stack exchange,提问作者fluent
相关产品推荐
相关产品推荐

