This is an automated email from the ASF dual-hosted git repository.
szita pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new 8c13be61c6 HIVE-26230: Option to URL encode special chars in
hbase.column.mapping that are valid HBase column family chars (#3314) (Adam
Szita, reviewed by Peter Vary)
8c13be61c6 is described below
commit 8c13be61c65211b15bf87bb26db1f03feef2c714
Author: Adam Szita <[email protected]>
AuthorDate: Wed Jun 1 22:41:53 2022 +0200
HIVE-26230: Option to URL encode special chars in hbase.column.mapping that
are valid HBase column family chars (#3314) (Adam Szita, reviewed by Peter Vary)
---
common/src/java/org/apache/hadoop/hive/conf/HiveConf.java | 4 ++++
.../org/apache/hadoop/hive/hbase/HBaseStorageHandler.java | 14 +++++++++++---
.../apache/hadoop/hive/hbase/TestHBaseStorageHandler.java | 15 ++++++++++++++-
3 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
index a0cd44583c..68564afa63 100644
--- a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
+++ b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
@@ -3471,6 +3471,10 @@ public class HiveConf extends Configuration {
HIVE_HBASE_SNAPSHOT_NAME("hive.hbase.snapshot.name", null, "The HBase
table snapshot name to use."),
HIVE_HBASE_SNAPSHOT_RESTORE_DIR("hive.hbase.snapshot.restoredir", "/tmp",
"The directory in which to " +
"restore the HBase table snapshot."),
+
HIVE_SECURITY_HBASE_URLENCODE_AUTHORIZATION_URI("hive.security.hbase.urlencode.authorization.uri",
false,
+ "When true it URL encodes the URI generated by HBaseStorageHandler for
authorization. The URI consists of the" +
+ "HBase table name, column family, etc. and may contain characters that
need encoding, such as #. If set to " +
+ "true, the corresponding Ranger policies need to be in URL encoded
format too."),
// For Kudu storage handler
HIVE_KUDU_MASTER_ADDRESSES_DEFAULT("hive.kudu.master.addresses.default",
"localhost:7050",
diff --git
a/hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseStorageHandler.java
b/hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseStorageHandler.java
index b5cecccd49..24b2ec9393 100644
---
a/hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseStorageHandler.java
+++
b/hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseStorageHandler.java
@@ -78,6 +78,8 @@ import org.slf4j.LoggerFactory;
import com.codahale.metrics.MetricRegistry;
+import static
org.apache.hadoop.hive.conf.HiveConf.ConfVars.HIVE_SECURITY_HBASE_URLENCODE_AUTHORIZATION_URI;
+
/**
* HBaseStorageHandler provides a HiveStorageHandler implementation for
* HBase.
@@ -308,9 +310,15 @@ public class HBaseStorageHandler extends
DefaultStorageHandler
return new URI(URIString);
}
- private static String encodeString(String rawString) {
- // Only url encode hash code value for now
- return rawString != null ? rawString.replace("#", "%23") : null;
+ private String encodeString(String rawString) {
+ if (rawString == null) {
+ return null;
+ }
+ if (HiveConf.getBoolVar(jobConf,
HIVE_SECURITY_HBASE_URLENCODE_AUTHORIZATION_URI)) {
+ return
HiveConf.EncoderDecoderFactory.URL_ENCODER_DECODER.encode(rawString);
+ } else {
+ return rawString.replace("#", "%23");
+ }
}
/**
diff --git
a/hbase-handler/src/test/org/apache/hadoop/hive/hbase/TestHBaseStorageHandler.java
b/hbase-handler/src/test/org/apache/hadoop/hive/hbase/TestHBaseStorageHandler.java
index b12df94f7f..25ddd3219f 100644
---
a/hbase-handler/src/test/org/apache/hadoop/hive/hbase/TestHBaseStorageHandler.java
+++
b/hbase-handler/src/test/org/apache/hadoop/hive/hbase/TestHBaseStorageHandler.java
@@ -101,8 +101,17 @@ public class TestHBaseStorageHandler {
serdeParams.put("hbase.zookeeper.property.clientPort", "8765");
serdeParams.put("hbase.table.name", "my#tbl");
serdeParams.put("hbase.columns.mapping", "myco#lumns");
+
+ // default configuration
URI uri = checkURIForAuth(createMockTable(serdeParams));
Assert.assertEquals("hbase://testhost:8765/my%23tbl/myco%23lumns",
uri.toString());
+
+ // full URL encoding turned on
+ serdeParams.put("hbase.columns.mapping", "myco#lumn\ns");
+ HiveConf hiveConf = new HiveConf();
+
hiveConf.setBoolVar(HiveConf.ConfVars.HIVE_SECURITY_HBASE_URLENCODE_AUTHORIZATION_URI,
true);
+ uri = checkURIForAuth(createMockTable(serdeParams), new JobConf(hiveConf));
+ Assert.assertEquals("hbase://testhost:8765/my%23tbl/myco%23lumn%0As",
uri.toString());
}
private TableDesc getHBaseTableDesc() {
@@ -117,8 +126,12 @@ public class TestHBaseStorageHandler {
}
private static URI checkURIForAuth(Table table) throws URISyntaxException {
+ return checkURIForAuth(table, new JobConf(new HiveConf()));
+ }
+
+ private static URI checkURIForAuth(Table table, JobConf jobConf) throws
URISyntaxException {
HBaseStorageHandler hbaseStorageHandler = new HBaseStorageHandler();
- hbaseStorageHandler.setConf(new JobConf(new HiveConf()));
+ hbaseStorageHandler.setConf(jobConf);
return hbaseStorageHandler.getURIForAuth(table);
}