当前位置: 首页 > 知识库问答 >
问题:

配置单元中的排序表(ORC文件格式)

邵毅
2023-03-14

我有一些困难,以确保我利用已排序的数据在一个配置单元表。(使用ORC文件格式)

我知道我们可以通过在create DDL中声明DistributeBy子句来影响数据从配置单元表中读取的方式。

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;

我真的需要在create DLL语句中使用clustered/sort吗?或者hive/orc知道如何利用插入过程已经确保了数据的排序这一事实吗?

这样做是否有意义:

CLUSTERED BY (trade_id) SORTED BY (trade_id, time) INTO 1 BUCKETS

共有1个答案

韦宏朗
2023-03-14

带桶表是一个过时的概念。

您不需要在表DDL中编写群集。

在加载表时使用distributebypartitionkey来减少对减速器的压力,特别是在编写ORC时,需要中间缓冲区来构建ORC,如果每个减速器加载多个分区,可能会导致OOM异常。

当表很大时,可以使用bytes.per.reducer来限制最大文件大小,如下所示:

set hive.exec.reducers.bytes.per.reducer=67108864;--or even less

如果你有更多的数据,就会启动更多的还原器,创建更多的文件。这比装载固定数量的铲斗更灵活。

这也会更好地工作,因为对于小表,您不需要创建更小的桶。

如果按分区键分配是不够的,因为你有一些数据偏斜和数据很大,你可以另外按随机分配。如果您有均匀分布的数据,则最好按列分布。如果不是,则按随机分配,以避免单台长运转减速器问题。

最后,您的insert语句可能看起来如下所示:

set hive.exec.reducers.bytes.per.reducer=33554432; --32Mb per reducer

INSERT OVERWRITE TABLE trades PARTITION (dt)
SELECT trade_id, name, contract_type, ts, dt
FROM raw_trades
DISTRIBUTE BY dt,                    --partition key is a must for big data
              trade_id,              --some other key if the data is too big and key is
                                     --evenly distributed (no skew)   
              FLOOR(RAND()*100.0)%20 --random to distribute additionally on 20 equal parts 

SORT BY contract_type; --sort data if you want filtering by this key 
                       --to work better using internal index

不要在表DDL中使用CLUSTERED BY,因为在插入过程中使用DISTRIBUTE BY、ORC w索引和bloom filters+SORT可以以更灵活的方式实现相同的功能

Distribute+sort可以极大地减少ORC文件的大小,减少了x3或x4倍。类似的数据可以被更好地压缩,并使内部索引更高效。

另请阅读:https://stackoverflow.com/a/55375261/2700344这是关于排序的相关答案:https://stackoverflow.com/a/47416027/2700344

 类似资料: