Hive中遇到的问题记录

1.cannot recognize input near ’ <EOF>’ ‘<EOF>’ ‘<EOF>’ in subquery source

  • 问题描述:

运行

select .....  from ( select ...... from ....)

的时候会遇到该问题

  • 解决方法:
    将语句改为
select ..... from ( select ...... from ....) a

2.Expression not in GROUP BY key ‘……’

  • 问题描述:
    这一点也是HQL语言在聚合函数上与SQL上的不同。HQL语句中当使用了GROUP BY 后,前面的select后跟的所有内容都只能是聚合函数(除了group by的对象),比如说COUNT、SUM等计算结果,不能直接是一个变量,就算这个变量只有一个值仍然是不行的。

  • 解决方法:
    方法一:将所有select后的所有内容都添加到GROUP BY 中,即结果将会按照顺序根据这些列分别都进行一下group by。
    方法二:将select语句中不是进行聚合计算的字段的变量前面都添加collect_set()函数,也就是将这个字段变成了一个集合来显示。

3.In strict mode, if ORDER BY is specified, LIMIT must also be specified. Error encountered near token ‘…..’

  • 问题描述:
    因为order by 会对输入做全局排序,在order by 状态下所有数据会到一台服务器进行reduce操作也即只有一个reduce,如果在数据量大的情况下会出现无法输出结果的情况。
    在hive.mapred.mode = strict 模式下,必须指定 limit ,否则执行会报上面的错。就算是指定了limit n,计算的也只是这n*map条记录中的全局最优排序,而不是真正意义上的全局最优排序。

  • 解决方法:
    方法一:增加limit语句,但若想实现全局最优排序的话,这个方法是不能够成功的。
    方法二:使用distribute by + sort by来进行实现。sort by是局部排序,而distribute by是控制map怎么划分reducer。distribute by是控制map的输出在reducer是如何划分的,也就是说表中的指定给distribute by的变量相同的数据会被送到同一个reducer取解决,然后再用sort by,就可以输出全局最优了。
    方法三:使用cluster by。cluster by实现了distribute by结合sort by的功能。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值