KYLIN-2801 Make default precision and scale in DataType (for hive) configurable


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/a3d42f11
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/a3d42f11
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/a3d42f11

Branch: refs/heads/master
Commit: a3d42f11924c734b40a7b61fbf6f2f8bac3caa88
Parents: 46cd881
Author: Hongbin Ma <mahong...@apache.org>
Authored: Tue Aug 22 14:12:27 2017 +0800
Committer: Hongbin Ma <m...@kyligence.io>
Committed: Tue Aug 22 16:00:14 2017 +0800

----------------------------------------------------------------------
 .../apache/kylin/common/KylinConfigBase.java    | 41 ++++++++++++++++++++
 .../kylin/metadata/datatype/DataType.java       | 24 ++++++------
 2 files changed, 54 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/a3d42f11/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
----------------------------------------------------------------------
diff --git 
a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java 
b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
index 0f5f3a9..b622825 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
@@ -598,6 +598,47 @@ abstract public class KylinConfigBase implements 
Serializable {
         return 
getOptional("kylin.source.hive.flat-table-cluster-by-dict-column");
     }
 
+    public int getDefaultVarcharPrecision() {
+        int v = 
Integer.parseInt(getOptional("kylin.source.hive.default-varchar-precision", 
"256"));
+        if (v < 1) {
+            return 256;
+        } else if (v > 65355) {
+            return 65535;
+        } else {
+            return v;
+        }
+    }
+
+    public int getDefaultCharPrecision() {
+        //at most 255 according to 
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-CharcharChar
+        int v = 
Integer.parseInt(getOptional("kylin.source.hive.default-char-precision", 
"255"));
+        if (v < 1) {
+            return 255;
+        } else if (v > 255) {
+            return 255;
+        } else {
+            return v;
+        }
+    }
+
+    public int getDefaultDecimalPrecision() {
+        int v = 
Integer.parseInt(getOptional("kylin.source.hive.default-decimal-precision", 
"19"));
+        if (v < 1) {
+            return 19;
+        } else {
+            return v;
+        }
+    }
+
+    public int getDefaultDecimalScale() {
+        int v = 
Integer.parseInt(getOptional("kylin.source.hive.default-decimal-scale", "4"));
+        if (v < 1) {
+            return 4;
+        } else {
+            return v;
+        }
+    }
+
     // 
============================================================================
     // SOURCE.KAFKA
     // 
============================================================================

http://git-wip-us.apache.org/repos/asf/kylin/blob/a3d42f11/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/DataType.java
----------------------------------------------------------------------
diff --git 
a/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/DataType.java 
b/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/DataType.java
index 66ff581..13cc2be 100644
--- 
a/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/DataType.java
+++ 
b/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/DataType.java
@@ -31,6 +31,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.util.BytesSerializer;
 import org.apache.kylin.common.util.BytesUtil;
 import org.apache.kylin.measure.MeasureTypeFactory;
@@ -177,21 +178,22 @@ public class DataType implements Serializable {
             }
         }
 
-        // FIXME 256 for unknown string precision
-        if ((name.equals("char") || name.equals("varchar")) && precision == 
-1) {
-            precision = 256; // to save memory at frontend, e.g. tableau will
-                             // allocate memory according to this
+        if (precision == -1) {
+            // FIXME 256 for unknown string precision
+
+            // why 256(255) as default? 
+            // to save memory at frontend, e.g. tableau will
+            // allocate memory according to this
             if (name.equals("char")) {
-                precision -= 1; //at most 255 according to 
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-CharcharChar
+                precision = 
KylinConfig.getInstanceFromEnv().getDefaultCharPrecision();
+            } else if (name.equals("varchar")) {
+                precision = 
KylinConfig.getInstanceFromEnv().getDefaultVarcharPrecision();
+            } else if ((name.equals("decimal") || name.equals("numeric"))) {
+                precision = 
KylinConfig.getInstanceFromEnv().getDefaultDecimalPrecision();
+                scale = 
KylinConfig.getInstanceFromEnv().getDefaultDecimalScale();
             }
         }
 
-        // FIXME (19,4) for unknown decimal precision
-        if ((name.equals("decimal") || name.equals("numeric")) && precision == 
-1) {
-            precision = 19;
-            scale = 4;
-        }
-
     }
 
     private String replaceLegacy(String str) {

Reply via email to