Hive Metastore 列宽限制

Hive Metastore column width limit

在 5.2.1 版本上使用 AWS EMR 作为数据处理环境,在处理具有复杂架构和许多嵌套字段的巨大 JSON 文件时, Hive 无法处理它并在它达到 4000 个字符列长度的当前限制时出错。

Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidObjectException(message:Invalid column type name is too long: [...]

查看文档,已经有很多关于此问题或类似问题的问题,但都没有解决 [1, 2]。在此建议将 Metastore 的几个字段更改为不同的值,以便允许更大的结构定义长度。

  • COLUMNS_V2.TYPE_NAME
  • TABLE_PARAMS.PARAM_VALUE
  • SERDE_PARAMS.PARAM_VALUE
  • SD_PARAMS.PARAM_VALUE

如第一期所述,建议的解决方案提到:

[...] after setting the values, the Metastore must also be configured and restarted."

然而,除了 DB 值之外,还没有指定必须配置什么。

因此,将当前本地 Metastore(在本例中为 mysql)的字段从 string 更新为 mediumtext 并重新启动 Metastore 进程后,仍然无法取得任何进展,因为尝试加载 JSON 继续失败并出现相同的错误。

我是不是遗漏了什么或者有人找到了解决这个问题的替代方法吗?

查看与 Hive issue HIVE-15249 相关的 MetaStore 源代码,除了在 MetaStore 表中设置的参数约束之外,还有一个额外的检查。

特别是在HiveMetaStoreUtils.java文件中,以下声明似乎是执行错误的原因:

public static final int MAX_MS_TYPENAME_LENGTH = 2000; // 4000/2, for an unlikely unicode case

因此,更改 MetaStore 中提到的值是不够的,因为代码约束会抛出异常。