【hive】关于浮点数比较的问题
当在hive中写下浮点数(例如:0.2)
hive会把浮点数(0.2)存储为double类型
但是系统中并不能精准表示0.2这个浮点数
正确的浮点数表示
float 0.2 —> 0.2000000
double 0.2 —> 0.200000000000
但是系统中表示为
float 0.2 —> 0.2000001
double 0.2 —> 0.200000000001
如果我们在hive中把 float(0.2)转化成为double(0.2)
实际上是 0.2000001 —> 0.200000100000
并不是 0.2000001 —> 0.200000000001
所以
float(0.2)转化的double(0.2) 是大于直接存储的double(0.2)
float类型和double类型相比较,hive中是自动把范围小的类型转化成为范围大的类型的,也就是float转化为doule
导致float转化成为的double类型的数字大于比较的double数字
所以我们在使用浮点数比较的时候,不要用hive的自动扩充精度来比较,尽量使用较小精度来比较.
也就是float和double比较的时候,把double cast( as float)才能显示正确结果.
示例:
TABLE table1
id (INT) ,taxes(float)
1 0.2
2 0.2
3 0.3
我们要找出大于0.2的id有哪些
select id,taxes from table1 where taxes > 0.2;
结果显示:
1 0.2
2 0.2
3 0.3
为什么会把0.2本身也显示呢?
因为hive把0.2存储为double类型,
0.2 —> 0.200000000001
而taxes为float类型
id (INT) ,taxes(float)
1 0.2 —> 0.2000001
2 0.2 —> 0.2000001
3 0.3 —> 0.3000001
当我们用float类型和double类型比较的时候
hive自动将taxes转化为double类型
id (INT) ,taxes(float) —> taxes(float_to_double)
1 0.2 —> 0.200000100000
2 0.2 —> 0.200000100000
3 0.3 —> 0.300000100000
所以实际上,float(0.2) —> float_to_double(0.2) > double(0.2)
怎么才能正确显示呢?
不使用hive的自动扩充精度机制,直接把double减少精度
也就是double —> float,
select id,taxes from table1 where taxes > cast(0.2 as float);
结果:
3 0.3
【hive】关于浮点数比较的问题的更多相关文章
- Hive函数大全
一.关系运算: 1. 等值比较: = 语法:A=B 操作类型:所有基本类型 描述: 如果表达式A与表达式B相等,则为TRUE:否则为FALSE 举例: hive> select 1 from l ...
- Spark入门实战系列--5.Hive(上)--Hive介绍及部署
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Hive介绍 1.1 Hive介绍 月开源的一个数据仓库框架,提供了类似于SQL语法的HQ ...
- Hive介绍、安装(转)
1.Hive介绍 1.1 Hive介绍 Hive是一个基于Hadoop的开源数据仓库工具,用于存储和处理海量结构化数据.它是Facebook 2008年8月开源的一个数据仓库框架,提供了类似于SQL语 ...
- hive函数参考手册
hive函数参考手册 原文见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF 1.内置运算符1.1关系运算符 运 ...
- hive[3] 数据类型和文件格式
Hive 支持关系型数据库中的大多数据基本数据类型,同时也支持3种集合类型: 3.1 Hive 的基本数据类型 支持多种不同他度的整形和浮点型数据类型,具体如下(全都是保留字): tinyint ...
- 【转】hive简介安装 配置常见问题和例子
原文来自: http://blog.csdn.net/zhumin726/article/details/8027802 1 HIVE概述 Hive是基于Hadoop的一个数据仓库工具,可以将结构化 ...
- 【转】 hive简介,安装 配置常见问题和例子
原文来自: http://blog.csdn.net/zhumin726/article/details/8027802 1 HIVE概述 Hive是基于Hadoop的一个数据仓库工具,可以将结构化 ...
- 大数据时代的技术hive:hive的数据类型和数据模型
在上篇文章里,我列举了一个简单的hive操作实例,创建了一张表test,并且向这张表加载了数据,这些操作和关系数据库操作类似,我们常把hive和关系数据库进行比较,也正是因为hive很多知识点和关系数 ...
- HIVE编程指南之HiveQL的学习笔记1
// HiveQLa) 数据定义语言1 数据库表的一个目录或命名空间,如果用户没有指定数据库的话,那么将会使用默认的数据库default-----创建数据库CREATE DATABASE guoyon ...
随机推荐
- 清晰讲解LSB、MSB和大小端模式及网络字节序
时隔一个月又回到了博客园写文章,很开心O(∩_∩)O~~ 今天在做需求的涉及到一个固件版本的概念,其中固件组的人谈到了版本号从MSB到LSB排列,检索查阅后将所得整理如下. MSB.LSB? MSB( ...
- 斐讯面试记录—三线程交替打印ABC
package cn.shenzhen.feixun; public class PrintABC extends Thread{ private String name; private Objec ...
- GYM - 101490 J Programming Tutors (匈牙利+二分)
题意:有N个学生和N个老师,每个人都有自己的坐标X,Y,给每个学生匹配一个老师,要求N个匹配中的距离最大值最小.其中距离的定义为:|X − X’| + |Y − Y ‘|. 分析:一道典型的最大值最小 ...
- Java 创建数组的方式, 以及各种类型数组元素的默认值
①创建数组的方式3种 ①第1种方法 public class MyTest { public static void main(String[] args){ //method 1 int[] arr ...
- tomcat源码调试
三.tomcat目录结构 tomcat的下载安装有很多教程,不再赘述. 现在的tomcat已经到9了,当tomcat下载安装完成后,其目录大致如下: 除了上面的文件夹,还有四个文件: ...
- oracle存储过程(返回列表的存储结合游标使用)总结 以及在java中的调用
这段时间开始学习写存储过程,主要原因还是因为工作需要吧,本来以为很简单的,但几经挫折,豪气消磨殆尽,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励. 以下是我在开发项目中第一次 ...
- c调用c++编的dll,c++调用c编写的dll,extern “C”的用法
转自:http://blog.csdn.net/life_is_too_hard/article/details/52137271 c和c++不能直接相互调用,主要是因为c++有重载函数的功能,为了区 ...
- PHP SQL写法 积累(注:PHPSQL与LINQ SQL相似)
1: $data ['parentid'] = $pid; M('menu')->where($data)->order(' id asc ')-> select(); // ...
- Web安全学习笔记之Openvas配置,使用,报告
OpenVAS(开放式漏洞评估系统)是一个客户端/服务器架构,它常用来评估目标主机上的漏洞.OpenVAS是Nessus项目的一个分支,它提供的产品是完全地免费.OpenVAS默认安装在标准的Kali ...
- Swoole学习(一)了解一下Swoole的强大并在Centos安装Swoole及PHP扩展开启
Swoole是面向生产环境的 PHP 异步网络通信引擎,官网:https://www.swoole.com/ 使 PHP 开发人员可以编写高性能的异步并发 TCP.UDP.Unix Socket.HT ...