在 trino 中读取配置单元桶 table 时,是什么导致 table 损坏错误?

What causes table corruption error when reading hive bucket table in trino?

首先,数据的格式不能透露,但是buckettable是通过hive中的以下table创建语句和选项创建的。

1.创建 DDL

 CREATE EXTERNAL TABLE `schema1.ex1`(
`col1` string,
`col2` string,
`col3` string,
`col4` string
)
PARTITIONED BY(`date` string)
CLUSTERED BY (col1) SORTED BY(col2) INTO 32 BUCKETS
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'...

2。设置 属性

set hive.enforce.bucketing = true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions=1000;
set hive.exec.max.dynamic.partitions.pernode=1000;
set hive.execution.engine=mr;
set hive.mapreduce.job.queuename=root.queue1;

3。插入数据(1个月)

Insert into table `schema1.ex1` partition(date)
select col1, col2, col3, col4 from `schema1.existing_table` where date between '2021-09-01' and '2021-10-01'

4.读取数据(trino)

然后,当我在trino中读取hive bucket table时,出现如下错误

 'io.trino.spi.TrinoException: Hive table is corrupt. 
File 'hdfs://cluster1/hive/warehouse/schema1/ex1/date=2021-09-02/000026_0' is for bucket 26, but contains a row for bucket 9.

不知道为什么会出现上面的错误。如果您能告诉我错误的原因和解决方法,我将不胜感激。

我使用 hive 3.1.2 和 trino-356。

Trino 实现桶验证。要抛出此错误,table 很可能确实已损坏。

桶验证验证数据在读取时是否在正确的桶中,因此试图防止不正确的查询结果。

为了测试,可以将以下 SET SESSION 子句添加到您的 Trino 查询中:

SET SESSION hive.validate_bucketing=false

查询将 运行,但应该检查是否有错误分桶的数据。