Hive Metastore列宽限制

时间:2017-02-01 17:42:49

标签: json hadoop hive emr metastore

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

  

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

查看文档,虽然所有未解决的 [12都已解决,但已存在许多与此问题或类似问题有关的问题。在此,建议将Metastore的多个字段更改为不同的值,以便为结构定义允许更长的长度。

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

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

  

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

然而,无法指定在数据库值旁边配置 的内容。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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