zoukankan      html  css  js  c++  java
  • Hive中实现SELECT TOP N的方法

    TOP N是实现最大/小N条数据。

    鉴于Hive提供了limit关键字,配合排序功能就很容易实现了。

    但是Hive中order by只能生成1个reduce,如果表的数据量太大,order by 就会有心无力

    例如SQL:select a from t_test order by a limit 10;

    控制台会输出:Number of reduce tasks determined at compile time: 1

    说明启动的reduce数是编译时决定的,查看该SQL的执行计划,发现只启动1个Job

    如果表数据量非常大,而我们只想取Top 10,那么这么做就非常不合理

    这样就可以考虑sort by ,就可以解决这个问题了

    select a from t_test sort by a limit 10;

    控制台会输出:Number of reduce tasks not specified. Estimated from input data size: 1

    说明reduce数不是编译时决定的,而是根据输入的文件大小动态决定的。

    sort by可以启动多个reduce,每个reduce做局部排序,这对于sort by limit N已经够了。

    从执行计划来看,sort by limit N启动了两个Job,第一个Job在每个reduce中做局部排序,分别取出Top N,然后第二个Job做全局排序,取出Top N得出想要的结果。

    假设:第一个Job启动了x个reduce,第二个Job对x个reduce排好序的x * N条数据做全局排序,取Top N ,从而得到想要的结果。

    这样就大大提升了select 效率。

  • 相关阅读:
    SQL Server 性能优化之RML Utilities:快速入门(Quick Start)(1)
    sp_rename sqlserver 表 列 索引 类型重命名
    T- SQL性能优化详解
    sql-索引的作用(超详细)
    用一条SQL语句取出第 m 条到第 n 条记录的方法
    SARG
    git
    ssh
    70小事
    websocket
  • 原文地址:https://www.cnblogs.com/zbw1112/p/12550751.html
Copyright © 2011-2022 走看看