在Hive中使用排序表

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;

我将磁盘上的数据复制到表中。 顺便提一下,这里的数据是按照符号聚类并按时间排序的。 但是我似乎无法让Hive使用这个概念,即避免再次排序。

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

我使用以下最终表格来强制进行Bucketing操作,并施加排序顺序。
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;

从Hive表中加载数据==========

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

很遗憾地看到,所有需要按照符号和时间排序的alltrades查询都需要重新进行排序...有没有什么方法可以解决这个问题? 此外,是否有一种方法可以在一个查询步骤中完成整个过程,而不是分为两个步骤?

为什么排序似乎无法正常工作 =======

请注意,表格是通过排序子句构建和填充的。我担心删除这些内容会导致未来的reducer行为像不需要排序一样。

以下是一个查询计划,我认为它不应该涉及排序...但实际上确实需要排序。========

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

hive.enforce.bucketing不会对数据集进行全局排序。相反,它会将数据在桶内排序(在您的情况下为每个分区8个桶)。因此,它需要一个全局排序步骤来满足您要查找的查询条件。

希望这可以帮助你, Nat


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

谢谢,但我放弃了Hive一段时间了...我想要更轻便的东西,比如Python Disco。 - fodon

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接