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

 

Hive中处理出现科学计数法的问题时,通常是因为数值类型的数据在转换为字符串时,由于数值过大或过小而自动采用了科学计数法表示。这会在处理数据时造成不便,因为科学计数法并不是我们期望的格式。为了解决这个问题,可以使用Hive内置的函数将科学计数法表示的字符串转换为标准形式。 1. 使用`CAST`函数转换数据类型:如果你确定这些数据本质上是数值类型,可以使用`CAST`函数将它们转换为适当的数据类型,如`BIGINT`、`FLOAT`等。例如,如果你有一个科学计数法表示的字符串字段,你可以将其转换为`DOUBLE`类型: ```sql SELECT CAST(scientific_notation_column AS DOUBLE) FROM your_table; ``` 2. 使用`REPLACE`函数去除科学计数法:如果数据原本是字符串类型,并且你希望以非科学计数法的形式展示,可以使用`REPLACE`函数来去除字符串中的科学计数法标记。这涉及到替换掉字符串中的"E"或者"e"以及紧随其后的数字。 ```sql SELECT REPLACE(column_with_scientific_notation, 'E', '*10^') FROM your_table; ``` 3. 使用`FORMAT_NUMBER`函数格式化数字:对于`DOUBLE`类型的字段,可以使用`FORMAT_NUMBER`函数将数字格式化为普通数字形式的字符串。 ```sql SELECT FORMAT_NUMBER(column_with_double_type, 2) FROM your_table; ``` 请注意,在实际操作中,如果数据中包含的是非数值的字符串,使用`CAST`函数转换可能会导致错误。在这种情况下,你需要根据数据的具体内容和格式来决定使用哪种方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值