当您在开始时或中间添加新列时,Impala 中的架构解析问题 1.使用架构解析属性2.覆盖数据

问题描述

我面临的问题与 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 (将#修改为@)