Skip to content

Commit

Permalink
HIVE-21952 : Allow unsetting of serde properties (Miklos Gergely, rev…
Browse files Browse the repository at this point in the history
…iewed by David Mollitor)
  • Loading branch information
miklosgergely authored Jun 16, 2020
1 parent 6569d58 commit 8208df9
Show file tree
Hide file tree
Showing 9 changed files with 311 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,8 @@ public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context, ASTNode ast)
case HiveParser.TOK_ALTERTABLE_ADDPARTS:
case HiveParser.TOK_ALTERTABLE_ADDCOLS:
case HiveParser.TOK_ALTERTABLE_CHANGECOL_AFTER_POSITION:
case HiveParser.TOK_ALTERTABLE_SERDEPROPERTIES:
case HiveParser.TOK_ALTERTABLE_SETSERDEPROPERTIES:
case HiveParser.TOK_ALTERTABLE_UNSETSERDEPROPERTIES:
case HiveParser.TOK_ALTERTABLE_CLUSTER_SORT:
case HiveParser.TOK_ALTERTABLE_DROPPARTS:
case HiveParser.TOK_ALTERTABLE_PROPERTIES:
Expand Down Expand Up @@ -212,7 +213,8 @@ public void postAnalyze(HiveSemanticAnalyzerHookContext context,
case HiveParser.TOK_ALTERTABLE_ADDPARTS:
case HiveParser.TOK_ALTERTABLE_ADDCOLS:
case HiveParser.TOK_ALTERTABLE_CHANGECOL_AFTER_POSITION:
case HiveParser.TOK_ALTERTABLE_SERDEPROPERTIES:
case HiveParser.TOK_ALTERTABLE_SETSERDEPROPERTIES:
case HiveParser.TOK_ALTERTABLE_UNSETSERDEPROPERTIES:
case HiveParser.TOK_ALTERTABLE_CLUSTER_SORT:
case HiveParser.TOK_ALTERTABLE_DROPPARTS:
case HiveParser.TOK_ALTERTABLE_PROPERTIES:
Expand Down
15 changes: 10 additions & 5 deletions parser/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
Original file line number Diff line number Diff line change
Expand Up @@ -172,8 +172,10 @@ TOK_ALTERPARTITION_MERGEFILES;
TOK_ALTERTABLE_TOUCH;
TOK_ALTERTABLE_ARCHIVE;
TOK_ALTERTABLE_UNARCHIVE;
TOK_ALTERTABLE_SERDEPROPERTIES;
TOK_ALTERPARTITION_SERDEPROPERTIES;
TOK_ALTERTABLE_SETSERDEPROPERTIES;
TOK_ALTERPARTITION_SETSERDEPROPERTIES;
TOK_ALTERTABLE_UNSETSERDEPROPERTIES;
TOK_ALTERPARTITION_UNSETSERDEPROPERTIES;
TOK_ALTERTABLE_SERIALIZER;
TOK_ALTERPARTITION_SERIALIZER;
TOK_ALTERTABLE_UPDATECOLSTATS;
Expand Down Expand Up @@ -1452,14 +1454,17 @@ alterViewSuffixProperties
;
alterStatementSuffixSerdeProperties[boolean partition]
@init { pushMsg("alter serdes statement", state); }
@init { pushMsg("alter serde statement", state); }
@after { popMsg(state); }
: KW_SET KW_SERDE serdeName=StringLiteral (KW_WITH KW_SERDEPROPERTIES tableProperties)?
-> {partition}? ^(TOK_ALTERPARTITION_SERIALIZER $serdeName tableProperties?)
-> ^(TOK_ALTERTABLE_SERIALIZER $serdeName tableProperties?)
| KW_SET KW_SERDEPROPERTIES tableProperties
-> {partition}? ^(TOK_ALTERPARTITION_SERDEPROPERTIES tableProperties)
-> ^(TOK_ALTERTABLE_SERDEPROPERTIES tableProperties)
-> {partition}? ^(TOK_ALTERPARTITION_SETSERDEPROPERTIES tableProperties)
-> ^(TOK_ALTERTABLE_SETSERDEPROPERTIES tableProperties)
| KW_UNSET KW_SERDEPROPERTIES tableProperties
-> {partition}? ^(TOK_ALTERPARTITION_UNSETSERDEPROPERTIES tableProperties)
-> ^(TOK_ALTERTABLE_UNSETSERDEPROPERTIES tableProperties)
;
tablePartitionPrefix
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
/**
* Analyzer for set serde properties commands.
*/
@DDLType(types = {HiveParser.TOK_ALTERTABLE_SERDEPROPERTIES, HiveParser.TOK_ALTERPARTITION_SERDEPROPERTIES})
@DDLType(types = {HiveParser.TOK_ALTERTABLE_SETSERDEPROPERTIES, HiveParser.TOK_ALTERPARTITION_SETSERDEPROPERTIES})
public class AlterTableSetSerdePropsAnalyzer extends AbstractAlterTableAnalyzer {
public AlterTableSetSerdePropsAnalyzer(QueryState queryState) throws SemanticException {
super(queryState);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.apache.hadoop.hive.ql.ddl.table.storage.serde;

import java.util.Map;

import org.apache.hadoop.hive.common.TableName;
import org.apache.hadoop.hive.ql.QueryState;
import org.apache.hadoop.hive.ql.ddl.DDLWork;
import org.apache.hadoop.hive.ql.ddl.DDLSemanticAnalyzerFactory.DDLType;
import org.apache.hadoop.hive.ql.ddl.table.AbstractAlterTableAnalyzer;
import org.apache.hadoop.hive.ql.ddl.table.AlterTableType;
import org.apache.hadoop.hive.ql.exec.TaskFactory;
import org.apache.hadoop.hive.ql.parse.ASTNode;
import org.apache.hadoop.hive.ql.parse.HiveParser;
import org.apache.hadoop.hive.ql.parse.SemanticException;

/**
* Analyzer for unset serde properties commands.
*/
@DDLType(types = {HiveParser.TOK_ALTERTABLE_UNSETSERDEPROPERTIES, HiveParser.TOK_ALTERPARTITION_UNSETSERDEPROPERTIES})
public class AlterTableUnsetSerdePropsAnalyzer extends AbstractAlterTableAnalyzer {
public AlterTableUnsetSerdePropsAnalyzer(QueryState queryState) throws SemanticException {
super(queryState);
}

@Override
protected void analyzeCommand(TableName tableName, Map<String, String> partitionSpec, ASTNode command)
throws SemanticException {
Map<String, String> props = getProps((ASTNode) (command.getChild(0)).getChild(0));

AlterTableUnsetSerdePropsDesc desc = new AlterTableUnsetSerdePropsDesc(tableName, partitionSpec, props);
addInputsOutputsAlterTable(tableName, partitionSpec, desc, AlterTableType.SET_SERDE_PROPS, false);
rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.apache.hadoop.hive.ql.ddl.table.storage.serde;

import java.util.Map;

import org.apache.hadoop.hive.common.TableName;
import org.apache.hadoop.hive.ql.ddl.table.AbstractAlterTableDesc;
import org.apache.hadoop.hive.ql.ddl.table.AlterTableType;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import org.apache.hadoop.hive.ql.plan.Explain;
import org.apache.hadoop.hive.ql.plan.Explain.Level;

/**
* DDL task description for ALTER TABLE ... UNSET SERDEPROPERTIES ... commands.
*/
@Explain(displayName = "Unset Serde Props", explainLevels = { Level.USER, Level.DEFAULT, Level.EXTENDED })
public class AlterTableUnsetSerdePropsDesc extends AbstractAlterTableDesc {
private static final long serialVersionUID = 1L;

public AlterTableUnsetSerdePropsDesc(TableName tableName, Map<String, String> partitionSpec,
Map<String, String> props) throws SemanticException {
super(AlterTableType.SET_SERDE_PROPS, tableName, partitionSpec, null, false, false, props);
}

@Override
public boolean mayNeedWriteId() {
return false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.apache.hadoop.hive.ql.ddl.table.storage.serde;

import org.apache.hadoop.hive.metastore.api.StorageDescriptor;
import org.apache.hadoop.hive.ql.ddl.DDLOperationContext;
import org.apache.hadoop.hive.ql.ddl.table.AbstractAlterTableOperation;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.metadata.Partition;
import org.apache.hadoop.hive.ql.metadata.Table;

/**
* Operation process of unsetting serde properties.
*/
public class AlterTableUnsetSerdePropsOperation extends AbstractAlterTableOperation<AlterTableUnsetSerdePropsDesc> {
public AlterTableUnsetSerdePropsOperation(DDLOperationContext context, AlterTableUnsetSerdePropsDesc desc) {
super(context, desc);
}

@Override
protected void doAlteration(Table table, Partition partition) throws HiveException {
StorageDescriptor sd = getStorageDescriptor(table, partition);
for (String key : desc.getProps().keySet()) {
sd.getSerdeInfo().getParameters().remove(key);
}
}
}
6 changes: 4 additions & 2 deletions ql/src/java/org/apache/hadoop/hive/ql/plan/HiveOperation.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,11 @@ public enum HiveOperation {
new Privilege[]{Privilege.ALTER_METADATA}, null),
ALTERPARTITION_SERIALIZER("ALTERPARTITION_SERIALIZER", HiveParser.TOK_ALTERPARTITION_SERIALIZER,
new Privilege[]{Privilege.ALTER_METADATA}, null),
ALTERTABLE_SERDEPROPERTIES("ALTERTABLE_SERDEPROPERTIES", HiveParser.TOK_ALTERTABLE_SERDEPROPERTIES,
ALTERTABLE_SERDEPROPERTIES("ALTERTABLE_SERDEPROPERTIES",
new int[] {HiveParser.TOK_ALTERTABLE_SETSERDEPROPERTIES, HiveParser.TOK_ALTERTABLE_UNSETSERDEPROPERTIES},
new Privilege[]{Privilege.ALTER_METADATA}, null),
ALTERPARTITION_SERDEPROPERTIES("ALTERPARTITION_SERDEPROPERTIES", HiveParser.TOK_ALTERPARTITION_SERDEPROPERTIES,
ALTERPARTITION_SERDEPROPERTIES("ALTERPARTITION_SERDEPROPERTIES",
new int[] {HiveParser.TOK_ALTERPARTITION_SETSERDEPROPERTIES, HiveParser.TOK_ALTERPARTITION_UNSETSERDEPROPERTIES},
new Privilege[]{Privilege.ALTER_METADATA}, null),
ALTERTABLE_CLUSTER_SORT("ALTERTABLE_CLUSTER_SORT", HiveParser.TOK_ALTERTABLE_CLUSTER_SORT,
new Privilege[]{Privilege.ALTER_METADATA}, null),
Expand Down
14 changes: 14 additions & 0 deletions ql/src/test/queries/clientpositive/table_storage.q
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,18 @@ EXPLAIN ALTER TABLE t SET SERDEPROPERTIES('property1'='value1', 'property2'='val
ALTER TABLE t SET SERDEPROPERTIES('property1'='value1', 'property2'='value2');
SHOW CREATE TABLE t;

EXPLAIN ALTER TABLE t UNSET SERDEPROPERTIES('property1');
ALTER TABLE t UNSET SERDEPROPERTIES('property1');
SHOW CREATE TABLE t;

-- it is valid to unset a non-existing property
ALTER TABLE t UNSET SERDEPROPERTIES('property1');
SHOW CREATE TABLE t;

-- a removed property can be set again
ALTER TABLE t SET SERDEPROPERTIES('property1'='value1');
SHOW CREATE TABLE t;

-- remove all serde properties
ALTER TABLE t UNSET SERDEPROPERTIES('property1', 'property2');
SHOW CREATE TABLE t;
137 changes: 137 additions & 0 deletions ql/src/test/results/clientpositive/llap/table_storage.q.out
Original file line number Diff line number Diff line change
Expand Up @@ -547,3 +547,140 @@ LOCATION
TBLPROPERTIES (
'bucketing_version'='2',
#### A masked pattern was here ####
PREHOOK: query: EXPLAIN ALTER TABLE t UNSET SERDEPROPERTIES('property1')
PREHOOK: type: ALTERTABLE_SERDEPROPERTIES
PREHOOK: Input: default@t
PREHOOK: Output: default@t
POSTHOOK: query: EXPLAIN ALTER TABLE t UNSET SERDEPROPERTIES('property1')
POSTHOOK: type: ALTERTABLE_SERDEPROPERTIES
POSTHOOK: Input: default@t
POSTHOOK: Output: default@t
STAGE DEPENDENCIES:
Stage-0 is a root stage

STAGE PLANS:
Stage: Stage-0
Unset Serde Props
table name: default.t
properties:
property1

PREHOOK: query: ALTER TABLE t UNSET SERDEPROPERTIES('property1')
PREHOOK: type: ALTERTABLE_SERDEPROPERTIES
PREHOOK: Input: default@t
PREHOOK: Output: default@t
POSTHOOK: query: ALTER TABLE t UNSET SERDEPROPERTIES('property1')
POSTHOOK: type: ALTERTABLE_SERDEPROPERTIES
POSTHOOK: Input: default@t
POSTHOOK: Output: default@t
PREHOOK: query: SHOW CREATE TABLE t
PREHOOK: type: SHOW_CREATETABLE
PREHOOK: Input: default@t
POSTHOOK: query: SHOW CREATE TABLE t
POSTHOOK: type: SHOW_CREATETABLE
POSTHOOK: Input: default@t
CREATE TABLE `t`(
`key` string,
`val` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe'
WITH SERDEPROPERTIES (
'property2'='value2')
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
#### A masked pattern was here ####
TBLPROPERTIES (
'bucketing_version'='2',
#### A masked pattern was here ####
PREHOOK: query: ALTER TABLE t UNSET SERDEPROPERTIES('property1')
PREHOOK: type: ALTERTABLE_SERDEPROPERTIES
PREHOOK: Input: default@t
PREHOOK: Output: default@t
POSTHOOK: query: ALTER TABLE t UNSET SERDEPROPERTIES('property1')
POSTHOOK: type: ALTERTABLE_SERDEPROPERTIES
POSTHOOK: Input: default@t
POSTHOOK: Output: default@t
PREHOOK: query: SHOW CREATE TABLE t
PREHOOK: type: SHOW_CREATETABLE
PREHOOK: Input: default@t
POSTHOOK: query: SHOW CREATE TABLE t
POSTHOOK: type: SHOW_CREATETABLE
POSTHOOK: Input: default@t
CREATE TABLE `t`(
`key` string,
`val` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe'
WITH SERDEPROPERTIES (
'property2'='value2')
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
#### A masked pattern was here ####
TBLPROPERTIES (
'bucketing_version'='2',
#### A masked pattern was here ####
PREHOOK: query: ALTER TABLE t SET SERDEPROPERTIES('property1'='value1')
PREHOOK: type: ALTERTABLE_SERDEPROPERTIES
PREHOOK: Input: default@t
PREHOOK: Output: default@t
POSTHOOK: query: ALTER TABLE t SET SERDEPROPERTIES('property1'='value1')
POSTHOOK: type: ALTERTABLE_SERDEPROPERTIES
POSTHOOK: Input: default@t
POSTHOOK: Output: default@t
PREHOOK: query: SHOW CREATE TABLE t
PREHOOK: type: SHOW_CREATETABLE
PREHOOK: Input: default@t
POSTHOOK: query: SHOW CREATE TABLE t
POSTHOOK: type: SHOW_CREATETABLE
POSTHOOK: Input: default@t
CREATE TABLE `t`(
`key` string,
`val` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe'
WITH SERDEPROPERTIES (
'property1'='value1',
'property2'='value2')
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
#### A masked pattern was here ####
TBLPROPERTIES (
'bucketing_version'='2',
#### A masked pattern was here ####
PREHOOK: query: ALTER TABLE t UNSET SERDEPROPERTIES('property1', 'property2')
PREHOOK: type: ALTERTABLE_SERDEPROPERTIES
PREHOOK: Input: default@t
PREHOOK: Output: default@t
POSTHOOK: query: ALTER TABLE t UNSET SERDEPROPERTIES('property1', 'property2')
POSTHOOK: type: ALTERTABLE_SERDEPROPERTIES
POSTHOOK: Input: default@t
POSTHOOK: Output: default@t
PREHOOK: query: SHOW CREATE TABLE t
PREHOOK: type: SHOW_CREATETABLE
PREHOOK: Input: default@t
POSTHOOK: query: SHOW CREATE TABLE t
POSTHOOK: type: SHOW_CREATETABLE
POSTHOOK: Input: default@t
CREATE TABLE `t`(
`key` string,
`val` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
#### A masked pattern was here ####
TBLPROPERTIES (
'bucketing_version'='2',
#### A masked pattern was here ####

0 comments on commit 8208df9

Please sign in to comment.