我看过其他一些关于此的帖子,但没有找到永久有效的答案。
我们有一张表,我不得不向它添加两列。为此,我删除了该表并重新创建了它。但由于它是一个外部表,它并没有删除关联的数据文件。数据从控制文件加载并按日期分区。因此,假设表中的日期是 2021-01-01
和 2021-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 很好,它只有 null
的 c4
和日期 c5
的 2021-01-01
)。
如果我运行命令 set PARQUET_FALLBACK_SCHEMA_RESOLUTION=name;
然后再次执行上面的查询,那就没问题了。但我必须在每次会话开始时运行 set PARQUET_FALLBACK_SCHEMA_RESOLUTION=name;
,这并不理想。
通过网上搜索,我想出了几个解决方案:
创建新表时删除所有数据文件,然后从头开始加载(我认为我们想保留旧文件)
重新加载每个日期(这可能并不理想,因为可能有很多日期需要重新加载和覆盖)
在 Cloudera Manager 中永久更改设置(我无权访问 CM,也不知道更改它的可行性)
是否有其他解决方案可以让我不必每次想在 Impala 中使用此表时都运行 set PARQUET_FALLBACK_SCHEMA_RESOLUTION=name;
?