废话不多说,报错如下:

DataNucleus.Datastore (Log4JLogger.java:error(115)) - 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

然后在全网搜索,几乎所有的文章都没正面讲原因(不好意思,这里用了夸张的手法,如果有说错的,还请见谅),要么就是臭长臭长的,很难受。

还有一个东西提一下,就是hive在控制台打印的报错信息是这样子的:

ERROR [main]: metastore.RetryingHMSHandler (RetryingHMSHandler.java:invoke(150)) - HMSHandler Fatal error: javax.jdo.JDODataStoreException: Error(s) were found while auto-creating/validating the datastore for classes. The errors are printed in the log, and are attached to this exception.

说实话,第一段很好判断,其实就是mysql的字符集编码的问题(所实话,这是一个很大的问题,后面慢慢解释),然后第二段报错是控制台打印的,只能够看出报错是因为在创建/插入/更新某个数据的数据出现了异常。

所以从这里告诉我们一个道理:出现报错去看log日志好吗?????

Hive中的日志分为两种
1. 系统日志,记录了hive的运行情况,错误状况。
2. Job 日志,记录了Hive 中job的执行的历史过程。

系统日志存储
在${HIVE_HOME}/conf/hive-log4j.properties 文件中记录了Hive日志的存储情况

重命名hive-log4j.properties.template   hive-log4j.properties
默认的存储情况:$
hive.root.logger=WARN,DRFA
hive.log.dir=/tmp/${user.name} # 默认的存储位置是/tmp这个临时目录(这个目录就好像Windows的回收站)
hive.log.file=hive.log  # 默认的文件名
可以修改到
hive.log.dir=/user/apache-hive-1.2.1-bin/log/${user.name}
hive.log.file=hive.log
Hive的Job日志存储
//Location of Hive run time structured log file
    HIVEHISTORYFILELOC("hive.querylog.location", "/tmp/" + System.getProperty("user.name")),
默认存储与 /tmp/{user.name}目录下。
 

通过如上的修改,再次生成的hive日志文件,就会在你自己指定的目录中了

扯远了,言归正传!!

所以通过以上的乱七八糟的东西,我们就确定了报错,是mysql中hive的元数据库的字符集问题,也正是因为字符集问题,导致了create或者insert或者load等等操作出现了问题!

1、如果有兴趣和心思,大家可以先研究明白mysql的字符集都有哪些地方是可以设置的。

2、如果没有,那请看接下来鄙人讲的东西。

原因分析:

-1.mysql数据库创建数据库的时候的字符集默认是latin1,很有可能之前被修改过,改成UTF8或者其他

如何查看?

注:这里的a这个库,是我的hive的元数据信息的库

如果是如上的这张图,那么a这个数据库的字符集就是utf-8,并且如果hive在这个库里面生成的相关元数据信息表,这些表也都会是utf-8的字符集!不信你看!

你会发现这里的所有表甚至表中的字段都是utf-8的字符集,并且当你在操作hive的时候,那么就很有可能会出现标题上的错误!

-2.然后你就会去百度,搜索各种各样的文章,发现可以这么修改数据库的字符集

alter database a character set latin1;

这里顺便提一句:

//修改数据库
alter database 数据库名 character set utf8;
//修改表
alter table 表名 convert to character set gbk;
//修改字段
alter table 表名 modify column '字段名' varchar(30) character set gbk not null;
//添加表字段
alter table 表名 add column '字段名' varchar (20) character set gbk;

天真的你发现,已经完全修改过来了,应该不会有问题了!

-3.然而这时候,你重启了你的环境(包括重启虚拟机一大堆杂七杂八的操作),打开hive,发现该报错的还是报错!

-4.为什么呢,你可以尝试下看看元数据库里的表的字符集有改变吗?

-5.所以问题已经很明显了,这样修改虽然数据库的字符集改了,但是其中表的字符集和字段都没改过来

hive报错: Specified key was too long; max key length is 767 bytes的更多相关文章

  1. hive mysql元数据,报错 Specified key was too long; max key length is 767 bytes

    Specified key was too long; max key length is 767 bytes 此错误为hive 元数据mysql 字符集编码问题 如 show create tabl ...

  2. hive建表报错:Specified key was too long; max key length is 767 bytes,hadoophive

    情况描述 Hive建表时报错,元数据存储在mysql中. 报错信息 如下: FAILED: Execution Error, bytes com.mysql.jdbc.exceptions.jdbc4 ...

  3. 导入sql文件报错:1071 Specified key was too long; max key length is 767 bytes

    ref: https://stackoverflow.com/questions/1814532/1071-specified-key-was-too-long-max-key-length-is-7 ...

  4. 【laravel5.4】php artisan migrate报错:Specified key was too long; max key length is 767 bytes

    1.原因:在进行 迁移文件生成时,程序并未给varchar类型字段设置 合适的长度,导致报错. 2.解决办法:找到database/ 目标迁移文件,修改其中类型为string的字段长度,建议不要超过2 ...

  5. hive报错:Caused by: ERROR XBM0H: Directory /var/lib/hive/metastore/metastore_db cannot be created.

    在cdh集群中,删除之前的hive服务,然后将hive添加到其他节点,然后再通过hive客户端连接hive报错: Caused by: ERROR XJ041: Failed to create da ...

  6. Sqoop- sqoop将mysql数据表导入到hive报错

    sqoop将mysql数据表导入到hive报错 [root@ip---- lib]# sqoop import --connect jdbc:mysql://54.223.175.12:3308/gx ...

  7. Hive 报错 Error while compiling statement: FAILED: ParseException line 1:0 character '' not supported here (state=42000,code=40000)

    Hive报错 Error while compiling statement: FAILED: ParseException line 1:0 character '' not supported h ...

  8. hive报错( Non-Partition column appears in the partition specification)

    在写及测的过程中发现的,有一些可能需要进一步验证.有时候hive报错位置不一定正确需要多确认 1 FAILED: NullPointerException null 不能用视图作为left outer ...

  9. Hive 报错 Failed to load class "org.slf4j.impl.StaticLoggerBinder".

    打开hive报错 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaultin ...

随机推荐

  1. InnoDB和MyISAM的区别与选择

    MyISAM 性能(适合小项目,读快速)MyISAM 是MySQL中默认的存储引擎,比如适合新闻系统,读为主.InnoDB 事务或外键支持(适合大项目,高并发读写)活跃用户20多万时候,也能很轻松应付 ...

  2. Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)

    一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...

  3. mybaits if标签语句

    Mybatis if 标签可用在许多类型的 SQL 语句中,我们以查询为例.首先看一个很普通的查询: <!-- 查询用户列表,like用户名称 --> <select id=&quo ...

  4. oracle for update和for update nowait的区别 - 转

    1.for update 和 for update nowait 的区别: 首先一点,如果只是select 的话,Oracle是不会加任何锁的,也就是Oracle对 select 读到的数据不会有任何 ...

  5. js 跨域 Jquery取得iframe中元素的几种方法

    http://www.jb51.net/article/34942.htm 收集利用Jquery取得iframe中元素的几种方法 : 父页面访问子页面 $(document.getElementByI ...

  6. http_build_query用法

    http_build_query (PHP 5) http_build_query -- 生成 url-encoded 之后的请求字符串描述string http_build_query ( arra ...

  7. Python爬虫学习——获取网页

    通过GET请求获取返回的网页,其中加入了User-agent信息,不然会抛出"HTTP Error 403: Forbidden"异常, 因为有些网站为了防止这种没有User-ag ...

  8. SQL2000系统表、存储过程、函数的功能介绍及应用

    转自:http://blog.csdn.net/zlp321002/article/details/480925 ----系统表------------------------------------ ...

  9. Thinkphp5笔记八:路由别名Route

    主要作用:隐藏自己的真实路由名称 application/Route.php 使用方法一: <?php use think\Route; Route::alias('home','index/i ...

  10. EJB与JPA的关系

    转自:http://www.cnblogs.com/o-andy-o/archive/2012/04/17/2453537.html JPA是基于Java持久化的解决方案,主要是为了解决ORM框架的差 ...