Hive Table 分区元数据问题

Hive Table Partition Metadata Issue

我们有一个长期存在的 Hive 内部分区 table。最近我们发现我们需要更改列的名称和数据类型。另外,我们需要从 table 中删除 3 条重复记录。所以我们执行了这一步。

alter table tablename CHANGE line_nbr line_id INT; (it was string before)

INSERT OVERWRITE TABLE table1 PARTITION(cmny_cd,order_dt)
select 
               column1,
               columnx
               from table1
               where id NOT IN ('1','2','3')
               and order_dt in (CAST('2020-02-18' AS DATE),CAST('2020-02-19' AS DATE),CAST('2020-10-30' AS DATE));"

尝试 运行 上述步骤来更改列名称和类型并删除重复项。在此期间,我们遇到了一个错误,说 table 中有几个坏分区。但是当检查时,欺骗并没有被删除,但是列名和类型被改变了。

现在,我们从 table 中删除了损坏的分区,然后尝试 运行 只在插入覆盖步骤中删除错误分区。它成功了,并删除了欺骗。但是,如果我现在尝试查询 table,对于某些日期,它会给我一个错误

-- presto error: Error opening Hive split gs:xxxx/cmny_cd=xxx/order_dt=2021-09-20/000000_0 (offset=0, length=24370774): Malformed ORC file. Cannot read SQL type 'integer' from ORC stream '._col6' of type STRING with attributes {} [gs:xxxx/cmny_cd=xxx/order_dt=2021-09-20/000000_0]

当我检查显示创建 table 时,名称和数据类型已更改,但是当我尝试以下操作时

describe formatted tablename partition (cmny_cd='xxx',order_dt='2021-09-20');

几个分区,它显示更改的名称和类型,但很少,它显示旧名称和字符串数据类型。我猜这可能发生了,因为我们第一次尝试更改数据类型和删除欺骗时失败了。

我很困惑我应该怎么做才能修复 table 并毫无问题地查询 table。有人可以帮忙吗?将不胜感激。

我们运行 msck repair table tablename 已经上table,但是没有解决问题

使用 Hive 覆盖所有分区,就像删除重复项时所做的那样。由于 ORC 文件和 Hive 元数据中的类型不同,某些分区仍未被覆盖并导致 Presto 出错。因此,只需尝试覆盖您之前没有覆盖或覆盖所有分区的分区:

INSERT OVERWRITE TABLE table1 PARTITION(cmny_cd,order_dt)
select 
        column1,
        columnx
        ...
  from table1
  ---you can limit partitions in the WHERE