问题描述
我面临的问题与 Impala 中的架构解析有关。 Impala 目前不支持按名称解析模式到文件的元数据 - 它只能通过索引来实现,即 Impala 根据表中列的顺序查找 Parquet 文件中的列。
例如:
表 T1,有 2 列 [A: int 和 B:String]
A|B
1|foo
2|bar
添加新列 [X: string]
X | A | B
test| 3 |bar1
Impala 根据索引读取此表。所以在 index(0) 处,有 2 种不同的数据类型 -
- string(w.r.t 新数据中的第 X 列),
- int(旧数据中的 W.r.t 列 A)。
在我的场景中,我使用更新的 DDL 重新创建了表以容纳新列,但由于我在中间添加了新列......查询时出现错误。
>文件 'hdfs://nameservice1/user/hive/warehouse/ra/rds_data.db/slot_data/date=20210107/part-00002.c000' 列的 Parquet 架构不兼容 'rds_data.slot_data.slotnumber'。列类型:INT, Parquet 架构:可选的 byte_array 位置
我发现的解决方法是:
1.使用架构解析属性
Set PARQUET_FALLBACK_SCHEMA_RESOLUTION=name
PARQUET_FALLBACK_SCHEMA_RESOLUTION 查询选项允许 Impala 按列名称而不是列顺序查找 Parquet 文件中的列。 但是,每个查询我的表的用户(在我的组织中)都需要在每个 HUE/impala 会话中点击它。
2.覆盖数据
由于新创建的表中的数据通过火花作业不断填充......我必须在表的末尾移动新的 X 列,然后覆盖执行更新的 DDL 后的数据(过去 2-3 天)。
目前解决方案#2 是我能想到的唯一永久解决方案......是否有任何其他解决方案/解决方法,我们不必触摸/覆盖数据,但它仍然适用于我组织中的所有用户?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)