Index: hcatalog/webhcat/java-client/src/main/java/org/apache/hive/hcatalog/api/HCatClientHMSImpl.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- hcatalog/webhcat/java-client/src/main/java/org/apache/hive/hcatalog/api/HCatClientHMSImpl.java (date 1423542575000) +++ hcatalog/webhcat/java-client/src/main/java/org/apache/hive/hcatalog/api/HCatClientHMSImpl.java (revision ) @@ -562,33 +562,35 @@ && "TRUE".equalsIgnoreCase(table.getParameters().get("EXTERNAL")); } - private void dropPartitionsUsingExpressions(Table table, Map partitionSpec, boolean ifExists) + private void dropPartitionsUsingExpressions(Table table, Map partitionSpec, + boolean ifExists, boolean deleteData) - throws SemanticException, TException { + throws SemanticException, TException { LOG.info("HCatClient: Dropping partitions using partition-predicate Expressions."); ExprNodeGenericFuncDesc partitionExpression = new ExpressionBuilder(table, partitionSpec).build(); ObjectPair serializedPartitionExpression = new ObjectPair(partitionSpec.size(), Utilities.serializeExpressionToKryo(partitionExpression)); hmsClient.dropPartitions(table.getDbName(), table.getTableName(), Arrays.asList(serializedPartitionExpression), - !isExternal(table), // Delete data? + deleteData && !isExternal(table), // Delete data? - false, // Ignore Protection? + false, // Ignore Protection? - ifExists, // Fail if table doesn't exist? + ifExists, // Fail if table doesn't exist? - false); // Need results back? + false); // Need results back? } private void dropPartitionsIteratively(String dbName, String tableName, - Map partitionSpec, boolean ifExists) throws HCatException, TException { + Map partitionSpec, boolean ifExists, boolean deleteData) + throws HCatException, TException { LOG.info("HCatClient: Dropping partitions iteratively."); List partitions = hmsClient.listPartitionsByFilter(dbName, tableName, getFilterString(partitionSpec), (short) -1); for (Partition partition : partitions) { - dropPartition(partition, ifExists); + dropPartition(partition, ifExists, deleteData); } } @Override public void dropPartitions(String dbName, String tableName, - Map partitionSpec, boolean ifExists) + Map partitionSpec, boolean ifExists, boolean deleteData) throws HCatException { LOG.info("HCatClient dropPartitions(db=" + dbName + ",table=" + tableName + ", partitionSpec: ["+ partitionSpec + "])."); try { @@ -596,17 +598,17 @@ Table table = hmsClient.getTable(dbName, tableName); if (hiveConfig.getBoolean("hive.hcat.drop.partitions.using.expressions", true)) { try { - dropPartitionsUsingExpressions(table, partitionSpec, ifExists); + dropPartitionsUsingExpressions(table, partitionSpec, ifExists, deleteData); } catch (SemanticException parseFailure) { LOG.warn("Could not push down partition-specification to back-end, for dropPartitions(). Resorting to iteration.", parseFailure); - dropPartitionsIteratively(dbName, tableName, partitionSpec, ifExists); + dropPartitionsIteratively(dbName, tableName, partitionSpec, ifExists, deleteData); } } else { // Not using expressions. - dropPartitionsIteratively(dbName, tableName, partitionSpec, ifExists); + dropPartitionsIteratively(dbName, tableName, partitionSpec, ifExists, deleteData); } } catch (NoSuchObjectException e) { throw new ObjectNotFoundException( @@ -621,10 +623,16 @@ } } - private void dropPartition(Partition partition, boolean ifExists) + @Override + public void dropPartitions(String dbName, String tableName, + Map partitionSpec, boolean ifExists) throws HCatException { + dropPartitions(dbName, tableName, partitionSpec, ifExists, true); + } + + private void dropPartition(Partition partition, boolean ifExists, boolean deleteData) throws HCatException, MetaException, TException { try { - hmsClient.dropPartition(partition.getDbName(), partition.getTableName(), partition.getValues()); + hmsClient.dropPartition(partition.getDbName(), partition.getTableName(), partition.getValues(), deleteData); } catch (NoSuchObjectException e) { if (!ifExists) { throw new ObjectNotFoundException( Index: hcatalog/webhcat/java-client/src/main/java/org/apache/hive/hcatalog/api/HCatClient.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- hcatalog/webhcat/java-client/src/main/java/org/apache/hive/hcatalog/api/HCatClient.java (date 1423542575000) +++ hcatalog/webhcat/java-client/src/main/java/org/apache/hive/hcatalog/api/HCatClient.java (revision ) @@ -379,6 +379,24 @@ throws HCatException; /** + * Drops partition(s) that match the specified (and possibly partial) partition specification. + * A partial partition-specification is one where not all partition-keys have associated values. For example, + * for a table ('myDb.myTable') with 2 partition keys (dt string, region string), + * if for each dt ('20120101', '20120102', etc.) there can exist 3 regions ('us', 'uk', 'in'), then, + * 1. Complete partition spec: dropPartitions('myDb', 'myTable', {dt='20120101', region='us'}) would drop 1 partition. + * 2. Partial partition spec: dropPartitions('myDb', 'myTable', {dt='20120101'}) would drop all 3 partitions, + * with dt='20120101' (i.e. region = 'us', 'uk' and 'in'). + * @param dbName The database name. + * @param tableName The table name. + * @param partitionSpec The partition specification, {[col_name,value],[col_name2,value2]}. + * @param ifExists Hive returns an error if the partition specified does not exist, unless ifExists is set to true. + * @param deleteData Whether to delete the underlying data. + * @throws HCatException,ConnectionFailureException + */ + public abstract void dropPartitions(String dbName, String tableName, + Map partitionSpec, boolean ifExists, boolean deleteData) + throws HCatException; + /** * List partitions by filter. * * @param dbName The database name.