0
私はSqoopバージョンを持っています:1.4.6sqoopがTeradataからDOUBLEにインポートする際にDECIMAL型をマップするのはなぜですか?
TeradataからHiveにデータをインポートすると、DECIMALタイプがDOUBLEに変換されています。
Hiveが正確に同等のデータ型を持っているのはなぜですか?
私はSqoopバージョンを持っています:1.4.6sqoopがTeradataからDOUBLEにインポートする際にDECIMAL型をマップするのはなぜですか?
TeradataからHiveにデータをインポートすると、DECIMALタイプがDOUBLEに変換されています。
Hiveが正確に同等のデータ型を持っているのはなぜですか?
これは、すべてのRDBMSに対して総称して記述したためです。
DECIMAL
はDOUBLE
とマッピングされます。 source codeの
有用な部分:
public static String toHiveType(int sqlType) {
switch (sqlType) {
case Types.INTEGER:
case Types.SMALLINT:
return "INT";
case Types.VARCHAR:
case Types.CHAR:
case Types.LONGVARCHAR:
case Types.NVARCHAR:
case Types.NCHAR:
case Types.LONGNVARCHAR:
case Types.DATE:
case Types.TIME:
case Types.TIMESTAMP:
case Types.CLOB:
return "STRING";
case Types.NUMERIC:
case Types.DECIMAL:
case Types.FLOAT:
case Types.DOUBLE:
case Types.REAL:
return "DOUBLE";
case Types.BIT:
case Types.BOOLEAN:
return "BOOLEAN";
case Types.TINYINT:
return "TINYINT";
case Types.BIGINT:
return "BIGINT";
default:
// TODO(aaron): Support BINARY, VARBINARY, LONGVARBINARY, DISTINCT,
// BLOB, ARRAY, STRUCT, REF, JAVA_OBJECT.
return null;
}
}
彼らはまた、DATE、TIME、TIMESTAMP、DECIMAL、NUMERIC SQLデータ・タイプに対してこのマッピングのために警告を置きます。
if (HiveTypes.isHiveTypeImprovised(colType)) {
LOG.warn(
"Column " + col + " had to be cast to a less precise type in Hive");
}
詳細については、source codeを参照してください。
これを修正できるといいですか? – paolov
@ user55570彼らはすべてのRDBMSのすべてのデータ型をテストすることができないので、彼らは基本的なマッピングを書いていました。だから我々は 'map-column-hive'タグを持っているのです –
はい、分かります。たぶん、ソースデータ型の型マッピングのオプションは、すべてのフィールド名の訂正を列挙するのではなく、うまくいくでしょう。もちろん、doubleは整数型のDECIMAL型の貧弱な変換であるため、どうにかして対処できるのは良いでしょう。 – paolov