5

Hive说我变了,Spark说不你没变

 3 years ago
source link: https://blog.51cto.com/u_14177015/5155808
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Hive说我变了,Spark说不你没变

原创

怀瑾握瑜的嘉与嘉 2022-03-29 09:22:28 ©著作权

文章标签 字段 数据 spark 文章分类 Spark 大数据 阅读数247

大家好,我是怀瑾握瑜,一只大数据萌新,家有两只吞金兽,嘉与嘉,上能code下能teach的全能奶爸

如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~


Hive说我变了,Spark说不你没变_字段

我说:我要买鼠标,领导的声音飘来:你姑娘要交伙食费了

我说:我要买键盘,领导的声音飘来:你姑娘要学舞蹈了

我说:我要买手机,领导的声音飘来:你姑娘要学钢琴了

我说:好的祖宗们,谁让卡在你们手里,你们说的算。。

今天写了一个spark程序,其实很简单,就是查询一张表一天的数据,遍历一下,计算个结果,然而放到大环境里运行缺报错了。

报错的现象很是诡异,明明看到SQL只查询一天,但缺直接扫描整个表的全部数据,然后还返回driver里,最后直接内存溢出,看DAG也是在查询阶段就执行了collection。

Hive说我变了,Spark说不你没变_spark_02

通过查资料,修改SQL,一溜十三张试了一上午,还是没有效果,以为还是程序或者sql的问题,但一直没有查询到原因。

2.还有意外收获

下午还在调查问题的我,突然收到了运维的通知,Flume落盘的数据太多有积压,已经报警了,调查下发现是数据落hive的程序报错了。

详细查看日志,发现和上午的程序的日志一样,都是查询表的全部数据,再看下报错的时间,开始回想有过什么操作。

上午因为需求给hive表增加了一个字段,这在以前也进行过,但是没有问题啊,而且插入字段后,我还通过

Presto的小工具查询过数据,新增的字段已经有数据了。

进入hive命令行,查看表的创建信息

show create table table_name

发现在字段列表中,新增的字段已经存在,再往下看,发现spark.sql.sources.schema.part.0对应的字符串中居然没有这个字段。

我也查了一下以前add column的几张表,对应的字符串里都有新增的字段,这个表却没有。

3.解决问题

现在的现象就好比:

hive说:我已经变了,你看人家presto就懂我,可以直接读我的信息

spark说:你不说,我怎么知道啊,我只读我的缓存里的,既然没有,就只能从头开始调查了

好吧,这个问题让我想起了很多经历。

试过了几种方式,比如:

  • 修改字段名称,然后再改回来
  • 刷新数据,msck repair table table_name
  • 用spark.catalog().refreshTable("table_name")

均无效果,最后想到两个绝杀方案。

3.1重新建表

重新建表肯定是可以的,毕竟表都重建了,那原数据肯定重新刷新了。

当前所有表都是外部表,其实重建完全没有影响,但这样毕竟不优雅,而且万一表不是外部表,就肯定无法使用这个方案。

本着工匠精神,再寻找下一个方案。

3.2修改hive元数据

通过修改hive的原数据,更新schema字段的值,使之变成正确的内容。

--查询数据库对应的ID
SELECT * FROM dbs WHERE name = 'db_name';
--查询对应表的ID
select * from tbls where TBL_NAME='table_name' and db_id = 'db_id';
--通过 table_id 查找 对应的schema 信息
select * from table_params where TBL_ID=table_id and PARAM_KEY='spark.sql.sources.schema.part.0';
//通过 修改schema ,把缺少的字段按照格式添加进去即可。
UPDATE table_params SET PARAM_VALUE='............' where TBL_ID=table_id and PARAM_KEY='spark.sql.sources.schema.part.0'

至此,问题解决,但这个问题是否还会复现,有待观察。


如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~

可关注公众号【怀瑾握瑜的嘉与嘉】,获取资源下载方式


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK