hive计算json对象的错误总和

时间:2013-01-24 08:53:03

标签: json hadoop mapreduce hive

我有一个包含一列的外部表 - 数据,其中数据是json对象

当我运行以下配置单元查询时

hive> select get_json_object(data, "$.ev") from data_table limit 3;     

Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_201212171824_0218, Tracking URL = http://master:50030/jobdetails.jsp?jobid=job_201212171824_0218
Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=master:8021 -kill job_201212171824_0218
 2013-01-24 10:41:37,271 Stage-1 map = 0%,  reduce = 0%
 ....
 2013-01-24 10:41:55,549 Stage-1 map = 100%,  reduce = 100%
 Ended Job = job_201212171824_0218
 OK
 2
 2
 2
 Time taken: 21.449 seconds

但是当我运行总和聚合时,结果很奇怪

hive> select sum(get_json_object(data, "$.ev")) from data_table limit 3;
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
 set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
 set mapred.reduce.tasks=<number>
Starting Job = job_201212171824_0217, Tracking URL =   http://master:50030/jobdetails.jsp?jobid=job_201212171824_0217
Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=master:8021 -kill  job_201212171824_0217
2013-01-24 10:39:24,485 Stage-1 map = 0%,  reduce = 0%
.....
2013-01-24 10:41:00,760 Stage-1 map = 100%,  reduce = 100%
Ended Job = job_201212171824_0217
OK
9.4031522E7
Time taken: 100.416 seconds

有人可以解释我为什么会这样吗?我该怎么做才能正常工作?

1 个答案:

答案 0 :(得分:1)

Hive似乎将您的JSON中的值视为float而不是int s,看起来您的表非常大,因此Hive可能使用“exponent”符号表示大浮点数,所以9.4031522E7可能意味着94031522

如果你想确保你正在使用sum over int,你可以将你的JSON字段强制转换为int,并且总和应该能够返回一个int:

$ hive -e "select sum(get_json_object(dt, '$.ev')) from json_table"
8.806305E7
$ hive -e "select sum(cast(get_json_object(dt, '$.ev') as int)) from json_table"
88063050