From 8df4b83017f74173b8289ab50b0f723a38e8eebe Mon Sep 17 00:00:00 2001 From: Nisheet Kumar Date: Tue, 10 Dec 2019 21:12:33 +0530 Subject: [PATCH] [HUDI-390] Add backtick character in hive queries to support hive identifier as tablename (#1090) --- .../org/apache/hudi/hive/HoodieHiveClient.java | 17 +++++++++++------ .../org/apache/hudi/hive/util/SchemaUtil.java | 4 +++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/hudi-hive/src/main/java/org/apache/hudi/hive/HoodieHiveClient.java b/hudi-hive/src/main/java/org/apache/hudi/hive/HoodieHiveClient.java index 1f76f2a6f..84caf734b 100644 --- a/hudi-hive/src/main/java/org/apache/hudi/hive/HoodieHiveClient.java +++ b/hudi-hive/src/main/java/org/apache/hudi/hive/HoodieHiveClient.java @@ -77,6 +77,7 @@ public class HoodieHiveClient { private static final String HOODIE_LAST_COMMIT_TIME_SYNC = "last_commit_time_sync"; // Make sure we have the hive JDBC driver in classpath private static String driverName = HiveDriver.class.getName(); + private static final String HIVE_ESCAPE_CHARACTER = SchemaUtil.HIVE_ESCAPE_CHARACTER; static { try { @@ -161,7 +162,9 @@ public class HoodieHiveClient { private String constructAddPartitions(List partitions) { StringBuilder alterSQL = new StringBuilder("ALTER TABLE "); - alterSQL.append(syncConfig.databaseName).append(".").append(syncConfig.tableName).append(" ADD IF NOT EXISTS "); + alterSQL.append(HIVE_ESCAPE_CHARACTER).append(syncConfig.databaseName) + .append(HIVE_ESCAPE_CHARACTER).append(".").append(HIVE_ESCAPE_CHARACTER) + .append(syncConfig.tableName).append(HIVE_ESCAPE_CHARACTER).append(" ADD IF NOT EXISTS "); for (String partition : partitions) { String partitionClause = getPartitionClause(partition); String fullPartitionPath = FSUtils.getPartitionPath(syncConfig.basePath, partition).toString(); @@ -192,9 +195,9 @@ public class HoodieHiveClient { private List constructChangePartitions(List partitions) { List changePartitions = Lists.newArrayList(); // Hive 2.x doesn't like db.table name for operations, hence we need to change to using the database first - String useDatabase = "USE " + syncConfig.databaseName; + String useDatabase = "USE " + HIVE_ESCAPE_CHARACTER + syncConfig.databaseName + HIVE_ESCAPE_CHARACTER; changePartitions.add(useDatabase); - String alterTable = "ALTER TABLE " + syncConfig.tableName; + String alterTable = "ALTER TABLE " + HIVE_ESCAPE_CHARACTER + syncConfig.tableName + HIVE_ESCAPE_CHARACTER; for (String partition : partitions) { String partitionClause = getPartitionClause(partition); Path partitionPath = FSUtils.getPartitionPath(syncConfig.basePath, partition); @@ -252,9 +255,11 @@ public class HoodieHiveClient { String newSchemaStr = SchemaUtil.generateSchemaString(newSchema, syncConfig.partitionFields); // Cascade clause should not be present for non-partitioned tables String cascadeClause = syncConfig.partitionFields.size() > 0 ? " cascade" : ""; - StringBuilder sqlBuilder = new StringBuilder("ALTER TABLE ").append("`").append(syncConfig.databaseName) - .append(".").append(syncConfig.tableName).append("`").append(" REPLACE COLUMNS(").append(newSchemaStr) - .append(" )").append(cascadeClause); + StringBuilder sqlBuilder = new StringBuilder("ALTER TABLE ").append(HIVE_ESCAPE_CHARACTER) + .append(syncConfig.databaseName).append(HIVE_ESCAPE_CHARACTER).append(".") + .append(HIVE_ESCAPE_CHARACTER).append(syncConfig.tableName) + .append(HIVE_ESCAPE_CHARACTER).append(" REPLACE COLUMNS(") + .append(newSchemaStr).append(" )").append(cascadeClause); LOG.info("Updating table definition with " + sqlBuilder); updateHiveSQL(sqlBuilder.toString()); } catch (IOException e) { diff --git a/hudi-hive/src/main/java/org/apache/hudi/hive/util/SchemaUtil.java b/hudi-hive/src/main/java/org/apache/hudi/hive/util/SchemaUtil.java index a67d2a88d..d945b589b 100644 --- a/hudi-hive/src/main/java/org/apache/hudi/hive/util/SchemaUtil.java +++ b/hudi-hive/src/main/java/org/apache/hudi/hive/util/SchemaUtil.java @@ -54,6 +54,7 @@ import java.util.stream.Collectors; public class SchemaUtil { private static final Logger LOG = LogManager.getLogger(SchemaUtil.class); + public static final String HIVE_ESCAPE_CHARACTER = "`"; /** * Get the schema difference between the storage schema and hive table schema. @@ -402,7 +403,8 @@ public class SchemaUtil { String partitionsStr = partitionFields.stream().collect(Collectors.joining(",")); StringBuilder sb = new StringBuilder("CREATE EXTERNAL TABLE IF NOT EXISTS "); - sb = sb.append(config.databaseName).append(".").append(config.tableName); + sb = sb.append(HIVE_ESCAPE_CHARACTER).append(config.databaseName).append(HIVE_ESCAPE_CHARACTER) + .append(".").append(HIVE_ESCAPE_CHARACTER).append(config.tableName).append(HIVE_ESCAPE_CHARACTER); sb = sb.append("( ").append(columns).append(")"); if (!config.partitionFields.isEmpty()) { sb = sb.append(" PARTITIONED BY (").append(partitionsStr).append(")");