Spark学习笔记:local class incompatible

前段时间往用户画像的hive表里增加了一个字段,之后提交作业一直报找不到这个方法的错,过了好久才突然想起来,我提交的jar包并没有更新(真是傻)...

更新了jar包之后,出现了local class incompatible这个错,也就是序列化版本不一致的问题。

于是开始各种找解决方案,大部分人的解决方法都是在序列化的class定义中,手动指定一个序列化的版本号,但由于我并不能直接修改Hive表的数据定义,所以这个方法并不可行。实际上,如果你用来编译的jar包与提交的jar包是同一个,一般是不会出现这种问题的,再就是,增加和删除字段通常也不会引发这种问题,只有修改了字段类型时,有一定概率出现。

那么我最后的解决方案,我发现实际上,我存了一部分数据到文件里,调用的方法是saveAsObjectFile,也就是包装后的SequenceFile,所以在我更新jar之后,无法读取用旧的jar存的文件,就是这样(囧,又是一个好傻的错)。我把所有文件都删掉,重新生成之后就好了。

所以,出现这个错误时。

首先,把你的程序用新的jar编译一遍。

其次,检查你提交的jar是不是最新的jar。

之后,检查你是否有之前使用旧的jar包生成的文件。

如果以上三项都没有问题,那么你可以尝试在class中手动指定一个序列化的id。java的bin目录下带有一个可以查看class 序列化版本号的工具,名字叫做serialver,不习惯用命令行的可以使用serialver -show,就会弹出一个小框框,可以自己填啦~

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值