Hive metastore 无法解析分区字段 is not null问题排查

2024-09-04 17:18

本文主要是介绍Hive metastore 无法解析分区字段 is not null问题排查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、问题描述
    • 二、解决方案

一、问题描述

周中发现一个问题,metastore根据条件获取分区时发生异常,导致扫描所有分区,最终导致gc异常。

hive编译时会进行逻辑优化,在执行分区裁剪时,会根据相关的分区过滤条件去metastore查询要扫描的分区目录。metastore会根据hiveserver传过来的条件表达式进行解析,然后过滤不需要的分区。

目前的问题是hiveserver传了一个 'date_p is not null’的子句,metastore这边无法解析(不支持),最终导致解析异常

另外经过测试发现如果hive QL中有between子句,并且join on中有分区字段,hiveserver查询分区时就会拼接 **‘date_p is not null’**的条件给metastore,导致metastore解析异常。

sql语句如下,其中date_p 是test表的一个分区

selectCOUNT(1)
from(selectdate_pfromtestwheredate_p BETWEEN 1and 2) ainner join (selectdate_pfromtestwheredate_p BETWEEN 1and 2) b on a.date_p = b.date_p;

metastore这边会收到分区过滤条件的语句:“date_p BETWEEN 1 AND 2 and date_p is not null”。

另外,将between换成大于、小于语句则可以正常运行。hiveserver 就不会自动拼接 "date_p is not null"给metastore。

二、解决方案

在metastore服务这边,PartFilterExprUtil#makeExpressionTree(PartitionExpressionProxy proxy,byte[] expr)会接收hiveserver传过来的分区过滤表达式,然后生成一个 ExpressionTree 后面用于去mysql中扫描分区。

代码如下

public static ExpressionTree makeExpressionTree(PartitionExpressionProxy expressionProxy,byte[] expr) throws MetaException {String filter = null;try {//使用PartitionExpressionProxy解析hiveserver传过来的数据,并生成分区过滤表达式filter = expressionProxy.convertExprToFilter(expr);} catch (MetaException ex) {throw new IMetaStoreClient.IncompatibleMetastoreException(ex.getMessage());}//根据分区过滤表达式构建ExpressionTree。如果filter中有 date_p is not null,因为不支持,此处就会报错return PartFilterExprUtil.makeExpressionTree(filter);
}

现在问题在于hiveserver传过来的 expr 中可能会有IsNotNull类型的过滤条件,metastore不支持,因此最简单的做法就是搜索 expr 中的所有节点,然后将IsNotNull节点移除,之后再去计算分区过滤表达式就不会带上date_p is Not Null了。

计算分区过滤表达式主要是PartitionExpressionProxy的工作,这是一个接口,metastore用的是它的实现类PartitionExpressionForMetastore,因此我们修改这个类的convertExprToFilter方法即可。

PartitionExpressionForMetastore#convertExprToFilter方法的原代码如下

@Override
public String convertExprToFilter(byte[] exprBytes) throws MetaException {return deserializeExpr(exprBytes).getExprString();
}

改成如下代码

@Override
public String convertExprToFilter(byte[] exprBytes) throws MetaException {ExprNodeGenericFuncDesc exprNodeGenericFuncDesc = deserializeExpr(exprBytes);GenericUDF genericUDF = exprNodeGenericFuncDesc.getGenericUDF();//如果是not null类型的过滤,就不处理if(genericUDF.getClass() == GenericUDFOPNotNull.class){return "";}//如果是and或者or类型,就检查子句中是否有not null类型的子句,有的话去掉Iterator<ExprNodeDesc> iterator = exprNodeGenericFuncDesc.getChildren().iterator();while (iterator.hasNext()){ExprNodeDesc child = iterator.next();if(child.getClass() == ExprNodeGenericFuncDesc.class){GenericUDF childUdf = ((ExprNodeGenericFuncDesc) child).getGenericUDF();if(childUdf.getClass() == GenericUDFOPNotNull.class){iterator.remove();}}}return exprNodeGenericFuncDesc.getExprString();
}

改完重新编译hive/ql 模块代码,然后替换到metastore的lib下的包重启即可。

由于PartitionExpressionForMetastore#convertExprToFilter中只有metastore的PartFilterExprUtil类会调用到,因此改造这个方法不会引起其他的问题。

这篇关于Hive metastore 无法解析分区字段 is not null问题排查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136535

相关文章

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误