通过JDBC操作Impala执行删除分区时如何获取已删除的分区数量
可行的两种实现方式如下:
首先说明下你拿不到返回结果的核心原因:Impala的ALTER TABLE DROP PARTITION这类DDL的执行结果不属于JDBC标准的更新计数范畴,所以getUpdateCount()会固定返回-1,只有用execute()而非executeUpdate()方法执行才能拿到携带删除信息的结果集。
方法1:使用Impala JDBC驱动原生扩展API
删除分区的数量会放在结果集的summary字段返回,只需调整执行方法即可拿到结果,代码示例如下:
import java.sql.ResultSet; import java.sql.Statement; import com.cloudera.impala.jdbc.ImpalaStatement; // 构造删除分区语句 String dropPartitionSql = "ALTER TABLE foobar DROP IF EXISTS PARTITION (pkey='foo' OR pkey='bar')"; Statement stmt = conn.createStatement(); // 注意用execute而非executeUpdate执行 boolean hasResultSet = stmt.execute(dropPartitionSql); if (hasResultSet) { // 高版本驱动可直接通过JDBC标准接口拿结果集,低版本可unwrap为ImpalaStatement后再调用getResultSet ResultSet rs = stmt.getResultSet(); if (rs.next()) { String summary = rs.getString(1); // 从summary中提取数字即可,示例:Dropped 1 partition(s). 提取得到1 int droppedCnt = Integer.parseInt(summary.replaceAll("[^0-9]", "")); System.out.println("实际删除分区数:" + droppedCnt); } rs.close(); } stmt.close();
方法2:通过系统表统计差值(无驱动依赖)
如果不想依赖Impala特定的驱动扩展,可以通过Impala系统表__impala_partitions统计删除前后符合条件的分区数差值,得到实际删除的分区数量,该方案兼容性更强,不受版本差异影响:
- 执行删除前先查询符合条件的分区数:
SELECT COUNT(*) AS cnt FROM __impala_partitions WHERE table_schema = '你的库名' AND table_name = 'foobar' AND pkey IN ('foo', 'bar');
- 执行你的
DROP PARTITION删除语句 - 再次执行第一步的查询语句,两次查询结果的差值就是实际删除的分区数量。
内容的提问来源于stack exchange,提问作者Michael Schaefers
相关产品推荐
相关产品推荐

