Как сделать так, чтобы улей быстрее возвращал строки? (скажем, предел 10) - PullRequest
0 голосов
/ 21 ноября 2019

Я заметил, что когда используется MR, даже для таких простых запросов, как:

select * from table where condition_a and condition_b limit 10;

Hive будет сканировать все данные (конечно), но он вернется только после завершения всех заданий MR, даже если мынужно всего 10 результатов.

Есть ли способ сказать hive просто вернуть первые 10 строк, а затем пропустить результат работы?

Заметьте, я понимаю, когда речь идет о работе MR, а не простослучай, когда никакое фактическое задание MR не создано.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 21 ноября 2019

С тех пор, это способ уменьшения карты. Необходимо подождать, прежде чем на самом деле вернуть результаты (т. Е. Сначала нужно зафиксировать результаты).

Если вам нужны те же результаты запроса быстрее, обратите внимание на тот же запрос, а затем кэшируйте результаты для более быстрого поиска в следующий раз.

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

Или используйте искру, чтобы получить результаты быстрее. Spark выполняет большую часть вычислений в оперативной памяти. Также для ускорения кеширования результатов запроса.

 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()
0 голосов
/ 21 ноября 2019

Вы можете использовать свойства оптимизации предела улья для достижения желаемых результатов ссылка

 <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>

Вы также можете обратиться к этим свойствам из документы улья

0 голосов
/ 21 ноября 2019

Можете ли вы попробовать

hive.mapred.mode = nonstrict

и

hive.map.aggr = false

кроме них вы можете попробовать сортировать по и распределяют по .

...