json – Hive Metastore列宽限制

在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)的字段从字符串更新为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中提到的值是不够的,因为代码约束将抛出异常.

点赞