Использование отсортированных таблиц в Hive - PullRequest
3 голосов
/ 04 августа 2011

В итоге: я чувствую, что моя система игнорирует концепцию предварительно отсортированных таблиц.- Я ожидал сэкономить время на этапе сортировки, потому что я использовал предварительно отсортированные данные, но план запроса, кажется, указывает на промежуточный этап сортировки.

Следуют неприятные подробности:

Настройка=======

Я установил следующие флаги: =============

set hive.enforce.bucketing = true;
set mapred.reduce.tasks=8;
set mapred.map.tasks=8;

Здесь я создаю таблицу для хранениявременная копия данных на диске ========

CREATE TABLE trades
      (symbol STRING, exchange STRING, price FLOAT, volume INT, cond
INT, bid FLOAT, ask FLOAT, time STRING)
PARTITIONED BY (dt STRING)
CLUSTERED BY (symbol) SORTED BY (symbol, time) INTO 8 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
 STORED AS TEXTFILE;

Здесь я копирую данные на диске в таблицу Кстати, данные здесь сгруппированы по символам и отсортированы по времени.Похоже, я не могу заставить Hive использовать эту концепцию ... т.е. избегать сортировки снова

LOAD DATA LOCAL INPATH '%(dir)s2010-05-07'
INTO TABLE trades
partition (dt='2010-05-07');

Я использую следующую финальную таблицу, чтобы применить разбивку на группы =========== иустановить порядок сортировки ===========

CREATE TABLE alltrades
      (symbol STRING, exchange STRING, price FLOAT, volume INT, cond
INT, bid FLOAT, ask FLOAT, time STRING)
CLUSTERED BY (symbol) SORTED BY (symbol, time) INTO 8 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
 STORED AS TEXTFILE;

данные загружаются из таблицы улья ==========

insert overwrite table alltrades
select symbol, exchange, price, volume, cond, bid, ask, time
from trades
distribute by symbol sort by symbol, time;

Эторазочаровывает тот факт, что при любом запросе на все сделки, требующем сортировки по символу, время снова выполняет сортировку ... есть ли способ обойти это?Кроме того, есть ли способ заставить весь этот процесс работать за 1 шаг вместо 2?

Почему сортировка не работает =======

Обратите внимание, что таблица былапостроен и заполнен с сортировкой по предложению.Боюсь, что их удаление приведет к тому, что будущий редуктор будет вести себя так, как будто сортировка не требуется.

Вот план запроса, который, по моему мнению, не должен включать сортировку ... но на самом деле это так. ========

hive> explain select symbol, time, price from alltrades sort by symbol, time;
OK
ABSTRACT SYNTAX TREE:
 (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME alltrades)))
(TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT
(TOK_SELEXPR (TOK_TABLE_OR_COL symbol)) (TOK_SELEXPR (TOK_TABLE_OR_COL
time)) (TOK_SELEXPR (TOK_TABLE_OR_COL price))) (TOK_SORTBY
(TOK_TABSORTCOLNAMEASC (TOK_TABLE_OR_COL symbol))
(TOK_TABSORTCOLNAMEASC (TOK_TABLE_OR_COL time)))))

STAGE DEPENDENCIES:
 Stage-1 is a root stage
 Stage-0 is a root stage

STAGE PLANS:
 Stage: Stage-1
   Map Reduce
     Alias -> Map Operator Tree:
       alltrades
         TableScan
           alias: alltrades
           Select Operator
             expressions:
                   expr: symbol
                   type: string
                   expr: time
                   type: string
                   expr: price
                   type: float
             outputColumnNames: _col0, _col1, _col2
             Reduce Output Operator
               key expressions:
                     expr: _col0
                     type: string
                     expr: _col1
                     type: string
               sort order: ++
               tag: -1
               value expressions:
                     expr: _col0
                     type: string
                     expr: _col1
                     type: string
                     expr: _col2
                     type: float
     Reduce Operator Tree:
       Extract
         File Output Operator
           compressed: false
           GlobalTableId: 0
           table:
               input format: org.apache.hadoop.mapred.TextInputFormat
               output format:
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat

 Stage: Stage-0
   Fetch Operator
     limit: -1

Ответы [ 3 ]

4 голосов
/ 29 апреля 2012

hive.enforce.bucketing не выполняет глобальную сортировку набора данных. Вместо этого он записывает данные, отсортированные внутри сегментов (в вашем случае 8 / раздел) Таким образом, требуется глобальный шаг сортировки для удовлетворения запроса, который вы ищете.

Надеюсь, это поможет, Nat

4 голосов
/ 15 сентября 2011

Вы проверяли эффект set hive.enforce.bucketing=true? От http://svn.apache.org/repos/asf/hive/branches/branch-0.7/conf/hive-default.xml

<property>
  <name>hive.enforce.sorting</name>
  <value>false</value>
  <description>Whether sorting is enforced. If true, while inserting into the table, sorting is enforced. </description>
</property>

Вы также можете найти полезной реализацию org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer#genBucketingSortingDest:

http://svn.apache.org/repos/asf/hive/branches/branch-0.7/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java

0 голосов
/ 19 августа 2015

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

The CLUSTERED BY and SORTED BY creation commands do not affect how
data is inserted into a table – only how it is read. This means that
users must be careful to insert data correctly by specifying the
number of reducers to be equal to the number of buckets, and using
CLUSTER BY and SORT BY commands in their query.

Также посмотрите на https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...