我在确保使用 Hive 表中的排序数据时遇到了一些困难。(使用 ORC 文件格式)
DISTRIBUTE BY
我知道我们可以通过在 create DDL 中声明一个子句来影响从 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
在各个映射器之间分发,然后对其进行排序。
我的问题是:
我不希望将数据拆分为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;
我真的需要CLUSTERED/SORT
在创建 DLL 语句中使用吗?或者 Hive/ORC 是否知道如何利用插入过程已经确保数据已排序的事实?
做类似的事情是否有意义:
CLUSTERED BY (trade_id) SORTED BY (trade_id, time) INTO 1 BUCKETS