分享

一个很困惑的关于GROUP BY的问题

leletuo2012 发表于 2016-3-21 15:58:04 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 7595
hive中 某表t有俩字段  a,b  其中a字段值如下
aaaa
bbbb
ccccc
dddd
字段a 经过 自定义的udf函数X转化后变成
a
b
-
d
其中 - 代表空值
现在根据udf转化后的值(X(a)) 进行分组统计
select X(a),count(b)
from t
group by X(a)
变成了这样的结果
- 4
这是为什么呢(感觉X没有起到实际作用 所有的a字段经过X后直接变了- 但是 单独 使用 select X(a) from  t 又能查出正常的 a,b,-,d这样的转为结果)
个人觉得结果应该是
a 1
b 1
- 1
d 1

ps :如果自定义函数X用 内置函数 比如substr进行处理 再分组统计,结果是对的 很是奇怪 向大家赐教

已有(6)人评论

跳转到指定楼层
wscl1213 发表于 2016-3-21 16:51:39
这个需要理解hive的内部机制,如果是正常的sql是没有问题的。
这里只是假设:
X(a),这里假设是传统substring(),这样是得出结果的, 如果group by substring(),这个可能解析就有问题了。
所以楼主可以group by 字段,而不是udf函数。如果排序,可以在udf函数里group by


同时楼主可以看下hive的执行计划
回复

使用道具 举报

leletuo2012 发表于 2016-3-21 17:13:09
如您所说 我使用了临时表
select xa ,count(b) from (
select X(a) as xa,b from t
) tt
group by xa,这样也是不行的 请楼上指教
回复

使用道具 举报

atsky123 发表于 2016-3-21 19:13:24
leletuo2012 发表于 2016-3-21 17:13
如您所说 我使用了临时表
select xa ,count(b) from (
select X(a) as xa,b from t

select tt.xa ,count(b) from (
select X(a) as xa,b from t
) tt
很多地方需要改进,上面是一个地方

回复

使用道具 举报

leletuo2012 发表于 2016-3-22 09:11:49
atsky123 发表于 2016-3-21 19:13
select tt.xa ,count(b) from (
select X(a) as xa,b from t
) tt

因为我这个X函数读取了一个使用add file命令加载的文件 然后将这个文件的内容加载到内存中,然后根据其对t表的a字段进行转化,如果出现异常(比如读取不了该文件)或者转化失败都直接返回 “-” ,以前是在单机伪分布式下测试 那么使用 没有问题,现在用的的是集群环境,我以前看过日志,很多转化时因为无法解析文件 而直接 返回了 ,现在hive直接部署在了管理节点上,数据节点上没有。如果要继续改进,从哪些方面考虑呢
回复

使用道具 举报

atsky123 发表于 2016-3-22 12:06:34
leletuo2012 发表于 2016-3-22 09:11
因为我这个X函数读取了一个使用add file命令加载的文件 然后将这个文件的内容加载到内存中,然后根据其对 ...

单机就可以,集群不可以??
这个应该不是,除非楼主写的是单机程序
回复

使用道具 举报

leletuo2012 发表于 2016-3-23 21:02:17
已经确定就是集群的问题,不知道为什么 通过add file命令添加的文件 在任务提交到yarn后 这个文件并没有下发到执行节点 从而造成提到的这个怪问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条