在5.2.1版本上使用 AWS EMR作为数据处理环境,在处理具有包含许多嵌套字段的复杂架构的巨大JSON文件时,Hive无法处理它并将错误视为它达到了4000个字符列长度的当前限制。
处理语句时出错:FAILED:执行错误,返回代码 1来自org.apache.hadoop.hive.ql.exec.DDLTask。 InvalidObjectException(消息:无效的列类型名称太长:[...]
查看文档,虽然所有未解决的 [1,2都已解决,但已存在许多与此问题或类似问题有关的问题。在此,建议将Metastore的多个字段更改为不同的值,以便为结构定义允许更长的长度。
COLUMNS_V2.TYPE_NAME
TABLE_PARAMS.PARAM_VALUE
SERDE_PARAMS.PARAM_VALUE
SD_PARAMS.PARAM_VALUE
如第一期所述,建议的解决方案提到:
[...]设置值后,Metastore也必须配置并重新启动。“
然而,无法指定在数据库值旁边配置 的内容。
因此,在将当前本地Metastore(本例中为mysql)从string
更新到mediumtext
并重新启动Metastore进程后,仍然无法获得任何进展,因为尝试加载JSON仍在继续以同样的错误失败。
我是否遗漏了某些内容,或者是否有人找到了解决此问题的替代解决方法?
答案 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中提到的值是不够的,因为代码约束会引发异常。