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
我们有一个长期存在的 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