Hive中遇到的问题记录

1.cannot recognize input near ’ ’ ‘’ ‘’ 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的功能。

你可能感兴趣的:(日常记录)