我们用Hive去连接一个Hbase款表,大概有150多个字段。
因此,就报了异常:
FAILED: Error in metadata: MetaException(message:javax.jdo.JDODataStoreException: Put request failed : INSERT INTO `SERDE_PARAMS` (`PARAM_VALUE`,`SERDE_ID`,`PARAM_KEY`) VALUES (?,?,?)
NestedThrowables:
org.datanucleus.store.mapped.exceptions.MappedDatastoreException: INSERT INTO `SERDE_PARAMS` (`PARAM_VALUE`,`SERDE_ID`,`PARAM_KEY`) VALUES (?,?,?) )
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask
后来翻了墙,查了谷歌度娘,发现了原因。
在hive元数据中,存放serde信息的是一个varchar(4000)的字段,为了兼容oracle。
但是超过4000个字段怎么办?
目前使用的是mysql数据库,解决方法是将字段扩充成30000如下:
mysql> desc SERDE_PARAMS;
+-------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| SERDE_ID | bigint(20) | NO | PRI | NULL | |
| PARAM_KEY | varchar(256) | NO | PRI | NULL | |
| PARAM_VALUE | varchar(4000) | YES | | NULL | |
+-------------+---------------+------+-----+---------+-------+
3 rows in set (0.03 sec)
mysql> alter table SERDE_PARAMS modify column PARAM_VALUE varchar(30000);
Query OK, 447 rows affected (0.86 sec)
Records: 447 Duplicates: 0 Warnings: 0
mysql> desc SERDE_PARAMS;
+-------------+----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------+------+-----+---------+-------+
| SERDE_ID | bigint(20) | NO | PRI | NULL | |
| PARAM_KEY | varchar(256) | NO | PRI | NULL | |
| PARAM_VALUE | varchar(30000) | YES | | NULL | |
+-------------+----------------+------+-----+---------+-------+
3 rows in set (0.08 sec)
异常解决。
但是只能暂时解决MySQL库中的问题,加入元数据存在其他库,则还会存在这样的问题。