繁体   English   中英

Hive 表分区元数据问题

[英]Hive Table Partition Metadata Issue

我们有一个长期存在的 Hive 内部分区表。 最近我们发现我们需要更改列的名称和数据类型。 此外,我们需要从表中删除 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));"

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

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

-- 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]

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

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

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

我很困惑我应该怎么做才能修复表并查询表而没有任何问题。 有人可以帮忙吗? 这将不胜感激。

我们已经在表上运行了 msck repair table tablename,但它没有解决问题

使用 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM