
问题:一个普普通通的大三小白,明年即将实习。
在集群上运行了一组sql。一个很简单的sql就是分组求和。很自然的用到了group by.
问题就在group by后面的字段。我用的那个字段(我起了个别名,而且用的就是别名),一般来说,这组sql在mysql是可以跑的,但是到了hive就会报错。
先来看一下这组数据。
上面为数据的全部。下面博主出错的代码给大家看一下
从上面的图片上,我们看到给name起了别名dd,在group by的时候用的就是这个dd。
报错信息:非法的表别名或者列名"dd"。后面给我们提示,这个dd可能是name,sj.ftime这三者中的一个。看到这个报错信息,不由得产生疑惑,为什么在mysql中运行的好好的,在Hive里面怎么出错了?
分析:
原因很简单,就是hive的语句执行顺序。
在这个sql里面,执行顺序如下
- from data 先找到data表
- group by 找到分组的字段 dd
- select 查找dd,sum(ftime)
第二步错了,原因很简单,我们的这个表字段里面,就没有dd这个字段,我们真正知道dd是在select里面。他是name的别名。知道了问题所在,重新写这段sql代码
纠错:
当我们把dd换成原来的name字段的时候,这段程序就成功的跑了起来。
总结:
hql属于类sql,会有一些内容与sql中的不一致,这是就需要我们去百度,去自己看这些报错信息,基本报错信息大部分是这种group by或者少了一些符号之类的。下次group by的时候不能再去使用别名。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)