5
0
mirror of https://github.com/apache/sqoop.git synced 2025-05-03 00:42:27 +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) {
HCatFieldSchema.Type hfsType = hfs.getType();
if (hfsType == HCatFieldSchema.Type.STRING
|| hfsType == HCatFieldSchema.Type.VARCHAR
|| hfsType == HCatFieldSchema.Type.CHAR) {
if (isStringType(hfsType)) {
String str = val.toString();
if (doHiveDelimsReplacement) {
str = FieldFormatter.hiveStringReplaceDelims(str,
@ -400,59 +398,71 @@ private Object convertNumberTypes(Object val, HCatFieldSchema hfs) {
return null;
}
if (val instanceof BigDecimal
&& hfsType == HCatFieldSchema.Type.STRING
|| hfsType == HCatFieldSchema.Type.VARCHAR
|| hfsType == HCatFieldSchema.Type.CHAR) {
&& isStringType(hfsType)) {
BigDecimal bd = (BigDecimal) val;
String bdStr = null;
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;
}
return convertBigDecimalToTextTypes(hfs, hfsType, bd);
}
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) {
return n.byteValue();
return number.byteValue();
} else if (hfsType == HCatFieldSchema.Type.SMALLINT) {
return n.shortValue();
return number.shortValue();
} else if (hfsType == HCatFieldSchema.Type.INT) {
return n.intValue();
return number.intValue();
} else if (hfsType == HCatFieldSchema.Type.BIGINT) {
return n.longValue();
return number.longValue();
} else if (hfsType == HCatFieldSchema.Type.FLOAT) {
return n.floatValue();
return number.floatValue();
} else if (hfsType == HCatFieldSchema.Type.DOUBLE) {
return n.doubleValue();
return number.doubleValue();
} 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) {
return n.toString();
return number.toString();
} else if (hfsType == HCatFieldSchema.Type.VARCHAR) {
VarcharTypeInfo vti = (VarcharTypeInfo) hfs.getTypeInfo();
HiveVarchar hvc = new HiveVarchar(val.toString(), vti.getLength());
HiveVarchar hvc = new HiveVarchar(number.toString(), vti.getLength());
return hvc;
} else if (hfsType == HCatFieldSchema.Type.CHAR) {
CharTypeInfo cti = (CharTypeInfo) hfs.getTypeInfo();
HiveChar hChar = new HiveChar(val.toString(), cti.getLength());
HiveChar hChar = new HiveChar(number.toString(), cti.getLength());
return hChar;
} else if (hfsType == HCatFieldSchema.Type.DECIMAL) {
return convertNumberIntoHiveDecimal(n);
return convertNumberIntoHiveDecimal(number);
}
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) {
BigDecimal bigDecimal = null;

View File

@ -446,6 +446,18 @@ public void testNumberTypes() throws Exception {
"decimal(18,2)", Types.DECIMAL, HCatFieldSchema.Type.DECIMAL, 18, 2,
HiveDecimal.create(new BigDecimal("2000")),
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>();
setExtraArgs(addlArgsArray);