【问题标题】:Hive Table Partition Metadata IssueHive 表分区元数据问题
【发布时间】:2022-01-18 02:58:39
【问题描述】:

我们有一个长期存在的 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,但它没有解决问题

【问题讨论】:

    标签: google-cloud-platform hive hiveql


    【解决方案1】:

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

    【讨论】:

    • 感谢@leftjoin 的回复。我之前尝试过这种插入覆盖,但它没有用,仍然有一些分区有旧的元数据。所以我创建了一个阶段表并从目标复制了所有数据。从目标中删除所有分区并从阶段插入目标,最终解决了问题。
    猜你喜欢
    • 2019-12-27
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    相关资源
    最近更新 更多