背景
公司有一套大数据的清洗流程,模式是:spark with hive。在执行聚合原始表的操作当中,有一个spark sql过滤条件,如下:
yyyy = '${yyyy}' and mm = '${mm}' and dd = '${dd}' and hh = '${hh}' and (dimen ='303' or (dimen='302' and as_burl=1))
在跑任务的过程中发现报错,提示dimen='6'的分区文件不存在,报错退出了。报错如下:
问题
dimen在过滤条件中只使用了dimen='303'和dimen='302',为什么会出现依赖dimen='6'的情况?
在yarn中查看这个任务的执行计划,发现在分区裁剪的信息中,只有:yyyy,mm,dd,hh的分区过滤,dimen分区被忽略。这样导致的问题就是spark会去扫描所有dimen分区的,就会出现上图的报错,提示dimen='6'的文件不存在。
解决方法
由于查询条件中,dimen出现了or条件,怀疑是这个影响了spark的执行计划,所以调整sql,通过sql子查询的方式,先查出所有dimen in ('303','302')
的数据,再进行聚合逻辑,查看其执行计划发现这次的计划中包含的dimen分区的过滤,问题解决。
总结
总的来说就是出现这种需要获取不属于过滤条件范围内的文件数据时,要先排查执行计划中是否有出现分区裁剪失效的问题。
标签:dimen,分区,裁剪,过滤,报错,spark From: https://www.cnblogs.com/hill1126/p/18598000