Hive数据类型转换-decimal 变成了string ,科学计数法怎么转换成正确的decimal

1、double , float ,decimal 千万不能转换成string,常常会自动使用科学计数法保存,这种转换Hive基本不支持可逆操作,只能扔人工代码转换。PS:不理解Hive为什么不内置这类函数呢。

2、上人工代码:

select 
case
--处理非科学计数法表示的字符串
when length(regexp_extract('2.0E7','([0-9]+\\.)([0-9]+)(E-*[0-9]+)',2)) = 0
then '2.0E7'
--处理整数
when length(regexp_extract('2.0E7','([0-9]+\\.)([0-9]+)(E[0-9]+)',2)) <= cast(regexp_extract('2.0E7','(E)([0-9]+)',2) as int)
then rpad(regexp_replace(regexp_extract('2.0E7','([^E]+)',1),'\\.',''),cast(regexp_extract('2.0E7','(E)([0-9]+)',2) as int)+1,'0')
--处理小数
when length(regexp_extract('2.0E7','([0-9]+\\.)([0-9]+)(E[0-9]+)',2)) > cast(regexp_extract('2.0E7','(E)([0-9]+)',2) as int)
then concat(substr(regexp_replace(regexp_extract('2.0E7','([^E]+)',1),'\\.',''),1,cast(regexp_extract('2.0E7','(E)([0-9]+)',2) as int)+1),'\.',
substr(regexp_replace(regexp_extract('2.0E7','([^E]+)',1),'\\.',''),cast(regexp_extract('2.0E7','(E)([0-9]+)',2) as int)+2))
--纯小数,处理类似“3.4E-6”这种字符串
when '2.0E7' regexp 'E-'
then concat('0.',repeat('0',cast(regexp_extract('2.0E7','(E)(-)([0-9]+)',3) as int)-1),regexp_replace(regexp_extract('2.0E7','(.+)(E)',1),'\\.',''))
else '2.0E7'
end

 


版权声明:本文为beishafengjiang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。