我有一些困难,以确保我利用已排序的数据在一个配置单元表。(使用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
带桶表是一个过时的概念。
您不需要在表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
我已经从Map R集群复制了所有orc文件,并遵循了相同的文件夹结构 创建了位置为#1的orc格式表 然后执行此命令“msck REPAIR TABLE<>” 上面的步骤通过时没有出错,但当我查询分区时,作业失败,出现以下错误 有人能告诉我,我们可以直接从ORC文件创建配置单元ORC分区表吗? 我的存储是蔚蓝数据湖。
我有一个配置单元表保存在ORC文件中,这是“create”命令中的定义: 我想从末尾删除一个列,所以我尝试了“alter table-replace columns”命令,在这里我没有写列名--但是得到了这个错误:
我有一个这样的蜂巢表: 那么,我该怎么做才能达到这个目的呢?
我正在尝试在ORC文件上创建外部配置单元表。 但当我试图在创建的表上执行select操作时,会出现以下错误: 有什么建议吗??