5
0
mirror of https://github.com/apache/sqoop.git synced 2025-05-04 04:00:53 +08:00

SQOOP-3233: SqoopHCatImportHelper.convertNumberTypes check for Varchar instead of Char

(Ferenc Szabo via Szabolcs Vasas)
This commit is contained in:
Szabolcs Vasas 2017-12-08 11:39:24 +01:00
parent a50869437e
commit 855c56fef8
2 changed files with 56 additions and 34 deletions

View File

@ -335,9 +335,7 @@ private Object converDateTypes(Object val, HCatFieldSchema hfs) {
private Object convertStringTypes(Object val, HCatFieldSchema hfs) { private Object convertStringTypes(Object val, HCatFieldSchema hfs) {
HCatFieldSchema.Type hfsType = hfs.getType(); HCatFieldSchema.Type hfsType = hfs.getType();
if (hfsType == HCatFieldSchema.Type.STRING if (isStringType(hfsType)) {
|| hfsType == HCatFieldSchema.Type.VARCHAR
|| hfsType == HCatFieldSchema.Type.CHAR) {
String str = val.toString(); String str = val.toString();
if (doHiveDelimsReplacement) { if (doHiveDelimsReplacement) {
str = FieldFormatter.hiveStringReplaceDelims(str, str = FieldFormatter.hiveStringReplaceDelims(str,
@ -400,59 +398,71 @@ private Object convertNumberTypes(Object val, HCatFieldSchema hfs) {
return null; return null;
} }
if (val instanceof BigDecimal if (val instanceof BigDecimal
&& hfsType == HCatFieldSchema.Type.STRING && isStringType(hfsType)) {
|| hfsType == HCatFieldSchema.Type.VARCHAR
|| hfsType == HCatFieldSchema.Type.CHAR) {
BigDecimal bd = (BigDecimal) val; BigDecimal bd = (BigDecimal) val;
String bdStr = null; return convertBigDecimalToTextTypes(hfs, hfsType, bd);
if (bigDecimalFormatString) {
bdStr = bd.toPlainString();
} else {
bdStr = bd.toString();
}
if (hfsType == HCatFieldSchema.Type.VARCHAR) {
VarcharTypeInfo vti = (VarcharTypeInfo) hfs.getTypeInfo();
HiveVarchar hvc = new HiveVarchar(bdStr, vti.getLength());
return hvc;
} else if (hfsType == HCatFieldSchema.Type.VARCHAR) {
CharTypeInfo cti = (CharTypeInfo) hfs.getTypeInfo();
HiveChar hChar = new HiveChar(bdStr, cti.getLength());
return hChar;
} else {
return bdStr;
}
} }
Number n = (Number) val; Number n = (Number) val;
return convertNumberToAnyType(hfs, hfsType, n);
}
private boolean isStringType(HCatFieldSchema.Type hfsType) {
return hfsType == HCatFieldSchema.Type.STRING
|| hfsType == HCatFieldSchema.Type.VARCHAR
|| hfsType == HCatFieldSchema.Type.CHAR;
}
private Object convertNumberToAnyType(HCatFieldSchema hfs, HCatFieldSchema.Type hfsType, Number number) {
if (hfsType == HCatFieldSchema.Type.TINYINT) { if (hfsType == HCatFieldSchema.Type.TINYINT) {
return n.byteValue(); return number.byteValue();
} else if (hfsType == HCatFieldSchema.Type.SMALLINT) { } else if (hfsType == HCatFieldSchema.Type.SMALLINT) {
return n.shortValue(); return number.shortValue();
} else if (hfsType == HCatFieldSchema.Type.INT) { } else if (hfsType == HCatFieldSchema.Type.INT) {
return n.intValue(); return number.intValue();
} else if (hfsType == HCatFieldSchema.Type.BIGINT) { } else if (hfsType == HCatFieldSchema.Type.BIGINT) {
return n.longValue(); return number.longValue();
} else if (hfsType == HCatFieldSchema.Type.FLOAT) { } else if (hfsType == HCatFieldSchema.Type.FLOAT) {
return n.floatValue(); return number.floatValue();
} else if (hfsType == HCatFieldSchema.Type.DOUBLE) { } else if (hfsType == HCatFieldSchema.Type.DOUBLE) {
return n.doubleValue(); return number.doubleValue();
} else if (hfsType == HCatFieldSchema.Type.BOOLEAN) { } else if (hfsType == HCatFieldSchema.Type.BOOLEAN) {
return n.byteValue() == 0 ? Boolean.FALSE : Boolean.TRUE; return number.byteValue() == 0 ? Boolean.FALSE : Boolean.TRUE;
} else if (hfsType == HCatFieldSchema.Type.STRING) { } else if (hfsType == HCatFieldSchema.Type.STRING) {
return n.toString(); return number.toString();
} else if (hfsType == HCatFieldSchema.Type.VARCHAR) { } else if (hfsType == HCatFieldSchema.Type.VARCHAR) {
VarcharTypeInfo vti = (VarcharTypeInfo) hfs.getTypeInfo(); VarcharTypeInfo vti = (VarcharTypeInfo) hfs.getTypeInfo();
HiveVarchar hvc = new HiveVarchar(val.toString(), vti.getLength()); HiveVarchar hvc = new HiveVarchar(number.toString(), vti.getLength());
return hvc; return hvc;
} else if (hfsType == HCatFieldSchema.Type.CHAR) { } else if (hfsType == HCatFieldSchema.Type.CHAR) {
CharTypeInfo cti = (CharTypeInfo) hfs.getTypeInfo(); CharTypeInfo cti = (CharTypeInfo) hfs.getTypeInfo();
HiveChar hChar = new HiveChar(val.toString(), cti.getLength()); HiveChar hChar = new HiveChar(number.toString(), cti.getLength());
return hChar; return hChar;
} else if (hfsType == HCatFieldSchema.Type.DECIMAL) { } else if (hfsType == HCatFieldSchema.Type.DECIMAL) {
return convertNumberIntoHiveDecimal(n); return convertNumberIntoHiveDecimal(number);
} }
return null; return null;
} }
private Object convertBigDecimalToTextTypes(HCatFieldSchema hfs, HCatFieldSchema.Type hfsType, BigDecimal bigDecimal) {
String bdStr = null;
if (bigDecimalFormatString) {
bdStr = bigDecimal.toPlainString();
} else {
bdStr = bigDecimal.toString();
}
if (hfsType == HCatFieldSchema.Type.VARCHAR) {
VarcharTypeInfo vti = (VarcharTypeInfo) hfs.getTypeInfo();
HiveVarchar hvc = new HiveVarchar(bdStr, vti.getLength());
return hvc;
} else if (hfsType == HCatFieldSchema.Type.CHAR) {
CharTypeInfo cti = (CharTypeInfo) hfs.getTypeInfo();
HiveChar hChar = new HiveChar(bdStr, cti.getLength());
return hChar;
} else {
return bdStr;
}
}
HiveDecimal convertNumberIntoHiveDecimal(Number number) { HiveDecimal convertNumberIntoHiveDecimal(Number number) {
BigDecimal bigDecimal = null; BigDecimal bigDecimal = null;

View File

@ -446,6 +446,18 @@ public void testNumberTypes() throws Exception {
"decimal(18,2)", Types.DECIMAL, HCatFieldSchema.Type.DECIMAL, 18, 2, "decimal(18,2)", Types.DECIMAL, HCatFieldSchema.Type.DECIMAL, 18, 2,
HiveDecimal.create(new BigDecimal("2000")), HiveDecimal.create(new BigDecimal("2000")),
new BigDecimal("2000"), KeyType.NOT_A_KEY), new BigDecimal("2000"), KeyType.NOT_A_KEY),
HCatalogTestUtils.colGenerator(HCatalogTestUtils.forIdx(3),
"decimal(18,2)", Types.DECIMAL, HCatFieldSchema.Type.VARCHAR, 20, 0,
new HiveVarchar("1999", 20), new BigDecimal("1999"), KeyType.NOT_A_KEY),
HCatalogTestUtils.colGenerator(HCatalogTestUtils.forIdx(4),
"decimal(18,2)", Types.DECIMAL, HCatFieldSchema.Type.CHAR, 20, 0,
new HiveChar("1998", 20), new BigDecimal("1998"), KeyType.NOT_A_KEY),
HCatalogTestUtils.colGenerator(HCatalogTestUtils.forIdx(5),
"int", Types.INTEGER, HCatFieldSchema.Type.VARCHAR, 20, 0,
new HiveVarchar("2001", 20 ), new BigDecimal("2001"), KeyType.NOT_A_KEY),
HCatalogTestUtils.colGenerator(HCatalogTestUtils.forIdx(6),
"int", Types.INTEGER, HCatFieldSchema.Type.CHAR, 20, 0,
new HiveChar("2002", 20), new BigDecimal("2002"), KeyType.NOT_A_KEY),
}; };
List<String> addlArgsArray = new ArrayList<String>(); List<String> addlArgsArray = new ArrayList<String>();
setExtraArgs(addlArgsArray); setExtraArgs(addlArgsArray);