4

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

处理语句时出错:FAILED:执行错误,从 org.apache.hadoop.hive.ql.exec.DDLTask 返回代码 1。InvalidObjectException(消息:无效的列类型名称太长:[...]

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

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

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

[...] 设置值后,还必须配置重新启动Metastore 。”

然而,除了 DB 值之外,没有指定必须配置的内容。

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

我是否遗漏了某些东西,或者是否有人找到了解决此问题的替代解决方法?

4

1 回答 1

1

查看与Hive 问题 HIVE-15249相关的 MetaStore 源代码,除了 MetaStore 表中设置的参数约束之外,还有一项附加检查。

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

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

因此,更改 MetaStore 中提到的值是不够的,因为代码约束将引发异常。

于 2017-02-14T12:17:41.420 回答