如何使配置单元更快地返回行(比如,限制10)

zzwlnbp8  于 2021-05-27  发布在  Hadoop
关注(0)|答案(4)|浏览(311)

我注意到当涉及mr时,即使是简单的询问,比如:

select * from table where condition_a and condition_b limit 10;

hive会扫描所有的数据(当然),但它只会在所有的mr jobs完成后返回,即使我们只需要10个结果。
有没有办法告诉hive只返回前10行,然后跳过作业的结果?
注意,我是在讨论什么时候涉及mr job,而不是针对没有创建实际mr job的简单情况。
谢谢!

o2g1uqev

o2g1uqev1#

您可以使用配置单元的限制优化属性来实现所需的结果

<property>
    <name>hive.limit.optimize.enable</name>
    <value>true</value>
    <description>Whether to enable to optimization to trying a smaller subset of data for simple LIMIT first.</description>
  </property>
  <property>
    <name>hive.limit.row.max.size</name>
    <value>100000</value>
    <description>When trying a smaller subset of data for simple LIMIT, how much size we need to guarantee each row to have at least.</description>
  </property>
  <property>
    <name>hive.limit.optimize.limit.file</name>
    <value>10</value>
    <description>When trying a smaller subset of data for simple LIMIT, maximum number of files we can sample.</description>
  </property>
  <property>
    <name>hive.limit.optimize.fetch.max</name>
    <value>50000</value>
    <description>
      Maximum number of rows allowed for a smaller subset of data for simple LIMIT, if it is a fetch query. 
      Insert queries are not restricted by this limit.
    </description>
  </property>

您还可以从配置单元文档中引用这些属性

nxowjjhe

nxowjjhe2#

你能试试吗 hive.mapred.mode = nonstrict 以及 hive.map.aggr = false 除此之外,您还可以尝试按排序和按分发。

uwopmtnx

uwopmtnx3#

因为,这是一个mapreduce方法。它需要在实际返回结果之前等待(即需要先提交结果)。
如果您需要相同的查询结果更快,请注意相同的查询,然后缓存结果以便下次更快地检索。

set hive.query.results.cache.enabled=true

或者使用spark更快地获取结果。spark在ram中完成大部分计算。还可以使它更快地缓存查询结果。

val SPARK:SparkSession = SparkSession
    .builder
    .appName("Test")
    .master("local[2]")
    .config("spark.sql.warehouse",new File("spark-warehouse").getAbsolutePath)
    .enableHiveSupport()
    .getOrCreate()

val SQL_CONTEXT:SQLContext = SPARK.sqlContext

val res = SQL_CONTEXT.sql("select * from table where condition_a and condition_b limit 10").cache()
jutyujz0

jutyujz04#

在我看来,配置单元不像hbase,如果您在查询时希望获得类似hbase的速度,那么您将无法在配置单元中获得它。
hive用于处理大量数据的批处理,不像hbase一次只查找一个数据。当您尝试运行配置单元查询时,它将运行mr作业,mr作业将对10亿条记录和10条记录运行完全相同的过程。
因此,当您设置其他答案中提到的一些环境变量时,它可能会更快,但在处理小数据时,您不能期望hbase、rdbms或其他数据库的速度

相关问题