美文网首页
Specified key was too long; max

Specified key was too long; max

作者: Sx_Ren | 来源:发表于2018-10-11 10:10 被阅读0次
  • 问题:
    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;

相关文章

网友评论

      本文标题:Specified key was too long; max

      本文链接:https://www.haomeiwen.com/subject/rjgvaftx.html