Impala 中不兼容的镶木地板类型

时间:2021-02-08 20:10:59

标签: hive schema parquet cloudera impala

我看过其他一些关于此的帖子,但没有找到永久有效的答案。

我们有一张表,我不得不向它添加两列。为此,我删除了该表并重新创建了它。但由于它是一个外部表,它并没有删除关联的数据文件。数据从控制文件加载并按日期分区。因此,假设表中的日期是 2021-01-012021-01-02。但只有 2021-01-02 在控制文件中。因此,当我加载该日期时,它会使用新列重新运行,一切都很好。但是 2021-01-01 仍然存在,但具有不同的架构。

这在 Hive 中没有问题,因为它似乎默认按名称而不是位置解析。但是 Impala 按位置解析,因此新列将其丢弃。

如果我有一个表格,以前有 c1,c2,c3 列,现在有额外的列 c4,c5,如果我尝试运行一个查询,例如

select * from my_table where c5 is null limit 3;

这将在 Impala 中产生不兼容的镶木地板架构错误(但 Hive 很好,它只有 nullc4 和日期 c52021-01-01)。

如果我运行命令 set PARQUET_FALLBACK_SCHEMA_RESOLUTION=name; 然后再次执行上面的查询,那就没问题了。但我必须在每次会话开始时运行 set PARQUET_FALLBACK_SCHEMA_RESOLUTION=name;,这并不理想。

通过网上搜索,我想出了几个解决方案:

  1. 创建新表时删除所有数据文件,然后从头开始加载(我认为我们想保留旧文件)

  2. 重新加载每个日期(这可能并不理想,因为可能有很多日期需要重新加载和覆盖)

  3. 在 Cloudera Manager 中永久更改设置(我无权访问 CM,也不知道更改它的可行性)

是否有其他解决方案可以让我不必每次想在 Impala 中使用此表时都运行 set PARQUET_FALLBACK_SCHEMA_RESOLUTION=name;

0 个答案:

没有答案