Specified key was too long; max key length is 767 bytes。

  • 问题:
    spark sql连接hive的元数据(mysql库)时报错:Specified key was too long; max key length is 767 bytes。

  • 解决:
    其实是mysql数据字符集问题,只要修改mysql中hive元数据库的字符集便可,即alter database dbname character set latin1;可是设置后启动时仍然报错,启动命令如下:
    ./spark-shell --master local[2] --jars ~/software/mysql-connector-java-5.1.27-bin.jar
    原来:
    Changing the MySQL settings does not change existing tables. You may
    need to convert them
    也就是说改变mysql设置,不能改变已经存在的表,需要转换表的编码,
    进入mysql(mysql -uroot -proot),查看hive元数据表:show create table PARTITIONS; 发现还是utf8编码。
    更改表的编码:
    mysql> alter table PARTITIONS convert to character set latin1;
    Query OK, 0 rows affected (0.02 sec)
    Records: 0 Duplicates: 0 Warnings: 0

mysql> alter table PARTITION_KEYS convert to character set latin1;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

也可以先删除原来的元数据库,在重新建库:
drop database hive;
create database hive character set latin1;
然后再启动hive,通过mysql命令show create table TBLS;可以看到新生成的元数据信息表的编码都是latin1.

综述: hive命令出现Specified key was too long; max key length is 767 bytes 错误。是由于元数据的编码导致。需要更改元数据库编码。如果元数据库中已经有了数据,不能删除。那么就更改对应的表的编码。如果元数据库为空。那么就删除元数据库。再重新建立数据库,并更改编码,然后再让hive来建表。

更改表的编码方式:
ALTER
TABLE
tbl_name
CONVERT
TO
CHARACTER
SET charset_name;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容