Hive-1.1.0的注意事项之元数据库建表时的字段编码问题

时间:2021-02-07 15:04:58
Hive安装过程中初始化matestore时字段编码问题: 背景,
因为mysql的配置文件中/etc/my.cnf中设置了默认的编码为utf8,而在该MySQL中创建hive元数据库时,如果不指定默认是使用latin1 ,所以在初始化Hive的matestore之后,会报错:
FAILED: Error in metadata: javax.jdo.JDODataStoreException: An exception was thrown while adding/validating class(es) : Specified key was too long; max key length is 767 bytes 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:39) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
at com.mysql.jdbc.Util.getInstance(Util.java:386) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2618) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568) 
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:842) 
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:681) 
at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:264) 
at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:264) 
at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatement(AbstractTable.java:730)  且因为该MySQL中已经有正在使用的数据库,即已经有其他的业务在使用该MySQL中的其他的库,也就是无法修改mysql的配置文件,否则mysql中的所有库都将会被修改,从而影响其他的业务。因此只能试图修改hive单个库的编码格式。 解决方法; 重新在Mysql中建一个Hive的库create database hive_tmp, 注意创建库之后先不要同步数据库,因为一旦同步数据库之后,Hive库中将会有数据,此时将无法修改Hive库的编码了。因此在创建Hive库之后,首先修改hive库的编码为latin1 alter database hive default character setlatin1; 之后在同步数据库,便可以解决该问题,