将小数转换为整数并找出两列之间的差

时间:2019-06-17 11:54:33

标签: hive hql hiveql

我有两列如下:

A      |  B
0.33   |  0.55
0.44   |  0.65
10     |  20
10.1   |  10.234
11.236 |  12.8963
12     |  30
30.5698|  35.6893

在以上各列中,应将带小数的值乘以100,以将其转换为整数,并且由于格式正确,因此请勿干扰整数。

使用转换后的整数,计算列的差。

所以我尝试了蜂巢式的MOD函数。

但是使用此功能,整数的差是正确的。但是小数位的区别是错误的。

我不知道我要去哪里错了。

我尝试了以下代码:

从样本中选择mod(B,100)-mod(A,100)

实际结果是:

A      |  B      |  C
0.33   |  0.55   |  22
0.44   |  0.65   |  21
10     |  20     |  10
10.1   |  10.234 |  13
11.236 |  12.8963|  166
12     |  30     |  18
30.5698|  35.6893|  512

1 个答案:

答案 0 :(得分:0)

A和B是什么数据类型? 如果将它们定义为小数,则所有值将具有相同的精度:

create  table temp.table_name           (                                                                                                                                                                                     
A                  decimal(10,5)  
,B                  decimal(10,5)  
)
stored as parquet location '../temp.db/table_name'
;

INSERT INTO TABLE temp.table_name 
  VALUES (0.33   ,0.55)
,(0.44   ,0.65)
,(10     ,20)
,(10.1   ,10.234)
,(11.236 ,12.8963)
,(12     ,30)
,(30.5698,35.6893);

选择结果(所有数据具有相同的精度):

+---------------+---------------+--+
| table_name.a  | table_name.b  |
+---------------+---------------+--+
| 0.33000       | 0.55000       |
| 0.44000       | 0.65000       |
| 10.00000      | 20.00000      |
| 10.10000      | 10.23400      |
| 11.23600      | 12.89630      |
| 12.00000      | 30.00000      |
| 30.56980      | 35.68930      |
+---------------+---------------+--+

选择以获取小数位差:

select a ,b ,( cast(round((b*100),0) as int) - 
 cast(round((a*100),0) as int)) as res
from temp.table_name;

结果-小数​​位数之差:

+-----------+-----------+-------+--+
|     a     |     b     |  res  |
+-----------+-----------+-------+--+
| 0.33000   | 0.55000   | 22    |
| 0.44000   | 0.65000   | 21    |
| 10.00000  | 20.00000  | 1000  |
| 10.10000  | 10.23400  | 13    |
| 11.23600  | 12.89630  | 166   |
| 12.00000  | 30.00000  | 1800  |
| 30.56980  | 35.68930  | 512   |
+-----------+-----------+-------+--+

希望可以为您提供帮助。