我遇到了一些困难,无法确定在Hive表中利用已排序的数据。(使用ORC文件格式)
我知道我们可以通过在创建DDL中声明 DISTRIBUTE BY
子句来影响从Hive表中读取数据的方式。
CREATE TABLE trades
(
trade_id INT,
name STRING,
contract_type STRING,
ts INT
)
PARTITIONED BY (dt STRING)
CLUSTERED BY (trade_id) SORTED BY (trade_id, time) INTO 8 BUCKETS
STORED AS ORC;
这意味着每次查询该表时,数据将按照
trade_id
在各个mapper之间分布,然后进行排序。我的问题是:
我不想把数据分成
N
个文件(桶),因为数据量不大,我希望保留小文件。但是,我确实想利用排序插入。
INSERT OVERWRITE TABLE trades
PARTITION (dt)
SELECT trade_id, name, contract_type, ts, dt
FROM raw_trades
DISTRIBUTE BY trade_id
SORT BY trade_id;
我是否真的需要在create DLL语句中使用CLUSTERED/SORT
?或者Hive/ORC知道如何利用插入过程已经确保数据排序的事实?
做类似以下的事情是否有意义:
CLUSTERED BY (trade_id) SORTED BY (trade_id, time) INTO 1 BUCKETS