3

要約すると、私のシステムは事前にソートされたテーブルの概念を無視しているように感じます。- 事前に並べ替えられたデータを使用していたので、並べ替えステップの時間を節約できると思っていましたが、クエリ プランは中間の並べ替えステップを示しているようです。

厄介な詳細は次のとおりです。

セットアップ =======

次のフラグを設定しました:=============

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;

ここでは、ディスク上のデータをテーブル BTW にコピーします。ここのデータは、シンボルごとにクラスター化され、時間ごとに並べ替えられています。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;

並べ替えられたシンボルを必要とする alltrades のクエリを確認するのは残念です。また、このプロセス全体を 2 ではなく 1 クエリ ステップで機能させる方法はありますか?

SORTING が機能しない理由 =======

テーブルが作成され、sort by 句が入力されていることに注意してください。これらを削除すると、将来のレデューサーがソートが不要であるかのように動作するようになるのではないかと心配しています。

これは、私の意見ではソートを含むべきではないが、実際にはソートを含むクエリの計画です。========

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
4

3 に答える 3

4

の効果はチェックされました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

于 2011-09-15T15:34:05.057 に答える
4

hive.enforce.bucketingデータセットのグローバルソートは行いません。代わりに、バケット内でソートされたデータを書き込みます (この場合は 8/パーティション)。したがって、探しているクエリを満たすには、グローバルな並べ替え手順が必要です。

これが役に立てば幸いです、ナット

于 2012-04-29T03:02:40.193 に答える
0

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もご覧ください。

于 2015-08-19T00:13:38.923 に答える