`

hive 不以科学计数法输出,hive计数法输出

    博客分类:
  • hive
 
阅读更多

Hiveint , float , double这些数值类型在存储大额度数字时,在前端展现上总是使用科学计数法来表示,例如:

hive> select pow(10,8) from dual;

OK

1.0E8

其实无论是普通的表示方式还是科学计数法表示,只是一个习惯问题,结果都是一样的。可是不能理解的是当把数值类型转化成字符串类型以后Hive竟然把数值转换成了科学计数法表示的字符串而非数值本身的字符串,例如:

hive> select cast(pow(10,8) as string) from dual;

OK

1.0E8

这样问题就来了,很对时候业务需求要求数值必须存储为字符串类型,但是如果存储的是一个科学计数法表示的字符串,那就失去了数值本身的含义,例如再想把这个字符串转回数值类型就会出现转换错误:

hive> select cast('1.0E8' as int) from dual;

OK

1

因此,需要有一种方法在把数值类型转换成字符串类型时,强制Hive不要转换成科学计数法表示。

我查找了很多资料没有找到Hive中例如一个参数可以做这个控制。因此只能采取其他策略进行转换。

当我们要转换的数值只有整型而没有小数时,我们可以先把数值类型转换成bigint类型,使用bigint类型存储的数值不会采用科学计数法表示,例如:

hive> select cast(pow(10,8) as bigint) from dual;

OK

100000000

hive> select cast(cast(pow(10,8) as bigint) as string) from dual;

OK

100000000

但是由于bigint只能存储整型,当我们处理浮点数时这个方法就不灵了。

不得已我只能采用字符串解析这种最原始的方法:

以下是我写的将科学计数法表示的字符串转换为普通表示法表示的字符串的转换SQL

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

例如要处理“1.5602200465E8”这样一个字符串:

hive> select
> case
>   when length(regexp_extract('1.5602200465E8','([0-9]+\\.)([0-9]+)(E-*[0-9]+)',2))=0 then '1.5602200465E8'
>   when length(regexp_extract('1.5602200465E8','([0-9]+\\.)([0-9]+)(E[0-9]+)',2))<=cast(regexp_extract('1.5602200465E8','(E)([0-9]+)',2) as int)
>     then rpad(regexp_replace(regexp_extract('1.5602200465E8','([^E]+)',1),'\\.',''),cast(regexp_extract('1.5602200465E8','(E)([0-9]+)',2) as int)+1,'0')
>   when length(regexp_extract('1.5602200465E8','([0-9]+\\.)([0-9]+)(E[0-9]+)',2))>cast(regexp_extract('1.5602200465E8','(E)([0-9]+)',2) as int)
>     then concat(substr(regexp_replace(regexp_extract('1.5602200465E8','([^E]+)',1),'\\.',''),1,cast(regexp_extract('1.5602200465E8','(E)([0-9]+)',2) as int)+1),'\.',
>    substr(regexp_replace(regexp_extract('1.5602200465E8','([^E]+)',1),'\\.',''),cast(regexp_extract('1.5602200465E8','(E)([0-9]+)',2) as int)+2))
>   when '1.5602200465E8' regexp 'E-'
>     then concat('0.',repeat('0',cast(regexp_extract('1.5602200465E8','(E)(-)([0-9]+)',3) as int)-1),regexp_replace(regexp_extract('1.5602200465E8','(.+)(E)',1),'\\.',''))
>   else '1.5602200465E8'
> end
> from dual;

OK

156022004.65

当然这种方法最好是封装到UDF中,显得更为简洁,代码可读性也更强

分享到:
评论

相关推荐

    kettle批量插入hive2,解决表输出速度慢问题

    “kettle在表输出到星环inceptor数据库时,由于选择了DB连接类型为Hadoop Hive2,并且在Kettle的big-data-plugin插件的源码中默认关闭了批量提交的功能”,这导致了在创建DB连接时,“supportsBatchUpdates”这一...

    hive客户端安装_hive客户端安装_hive_

    在大数据处理领域,Hive是一个非常重要的工具,它提供了一个基于Hadoop的数据仓库基础设施,用于数据查询、分析和管理大规模数据集。本教程将详细讲解如何在Linux环境下安装Hive客户端,以便进行数据操作和分析。 ...

    HIVE安装及详解

    "HIVE安装及详解" HIVE是一种基于Hadoop的数据仓库工具,主要用于处理和分析大规模数据。下面是关于HIVE的安装及详解。 HIVE基本概念 HIVE是什么?HIVE是一种数据仓库工具,主要用于处理和分析大规模数据。它将...

    (Hive输出)pentaho-big-data-kettle-plugins-hive-6.1.0.1-196

    (Hive输出)ETLDesigner\common\system\karaf\system\pentaho\pentaho-big-data-kettle-plugins-hive\6.1.0.1-196\下的文件。 (Hive输出)pentaho-big-data-kettle-plugins-hive-6.1.0.1-196。

    Hive3.1.2编译源码

    使用hive3.1.2和spark3.0.0配置hive on spark的时候,发现官方下载的hive3.1.2和spark3.0.0不兼容,hive3.1.2对应的版本是spark2.3.0,而spark3.0.0对应的hadoop版本是hadoop2.6或hadoop2.7。 所以,如果想要使用高...

    Hive_JDBC.zip_hive java_hive jdbc_hive jdbc pom_java hive_maven连

    在大数据处理领域,Apache Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive Query Language)查询存储在Hadoop集群中的大型数据集。Hive JDBC(Java Database Connectivity)是Hive提供的一种...

    Spark不能使用hive自定义函数.doc

    1. **环境配置不兼容**:Spark 和 Hive 的运行环境可能存在不一致的地方,比如版本不匹配等。 2. **类路径问题**:Spark 在启动时可能没有正确地加载到 Hive 的自定义函数所在的 jar 包。 3. **依赖管理**:Hive UDF...

    hive

    总结来说,Hive 是大数据领域中不可或缺的一部分,它为大规模数据处理提供了一种易于理解和使用的解决方案,使得数据分析工作变得更加高效和便捷。通过学习和掌握 Hive,用户可以更好地管理和利用 Hadoop 生态系统中...

    Hive 多行合并和分组limit输出 UDF工具包

    用于多行合并和分组limit输出的udf工具包,已编译配置好,直接调用即可

    Ambari下Hive3.0升级到Hive4.0

    这通常涉及到运行特定的迁移脚本,以确保 Hive 3.0 的元数据能在 Hive 4.0 中正确解析。 6. **服务升级**:在 Ambari 中,按照界面提示进行服务的升级操作。这包括停止 Hive 3.0 服务,升级相关组件,然后启动 Hive...

    Hive驱动1.1.0.zip

    在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(HQL,Hive Query Language)查询和管理存储在Hadoop分布式文件系统(HDFS)中的大量结构化数据。Hive 1.1.0是Hive的一个版本,提供了...

    hive-jdbc hive jdbc驱动

    hive-jdbc

    hive-3.1.1安装包

    Hive是一个基于Hadoop的数据仓库工具,它本身并不存储数据,部署在Hadoop集群上,数据是存储在HDFS上的. Hive所建的表在HDFS上对应的是一个文件夹,表的内容对应的是一个文件。它不仅可以存储大量的数据而且可以对...

    Hive表生成工具,Hive表生成工具Hive表生成工具

    Hive表生成工具,Hive表生成工具Hive表生成工具

    hive相关jar包

    5. **Hadoop相关依赖**:由于Hive是构建在Hadoop之上的,因此需要Hadoop的相关jar包,如hadoop-client,以支持与HDFS的交互。 6. **Maven依赖**:在Java开发环境中,Maven是常用的构建和依赖管理工具。"maven"标签...

    hive参数配置说明大全

    该参数决定了Mapper/Reducer在本地模式的最大内存量,以字节为单位,0为不限制。如果设置为0,则Mapper/Reducer将不受内存限制,默认值为0。 6. mapred.reduce.tasks 该参数决定了所提交Job的Reducer的个数,使用...

    hive-site.xml

    hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+hadoop配置文件hive+...

    工业大数据分析-HIVE输入与输出教学讲义.docx

    工业大数据分析-HIVE输入与输出教学讲义 本资源是关于工业大数据分析的教学讲义,主要讲解了HIVE输入与输出的相关知识点。 HIVE 输入与输出任务概述 HIVE输入与输出任务的主要目的是读取csv文件数据,并将其存储...

    连接hive依赖的jar包_hive连接方式

    在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,使得用户可以使用SQL语句来处理存储在Hadoop分布式文件系统(HDFS)上的大数据。...

    工业大数据分析-HIVE输入与输出教学课件.pptx

    工业大数据分析-HIVE输入与输出教学课件 工业大数据分析是指通过对工业数据的收集、存储、处理和分析,获取有价值的信息和知识,以支持工业生产和决策的过程。工业大数据分析通常涉及到大量的数据处理和分析,需要...

Global site tag (gtag.js) - Google Analytics