为什么 sqoop 将导入中的 DECIMAL 类型从 Teradata 映射到 DOUBLE?

Why does sqoop map DECIMAL types in an import from Teradata to DOUBLE?

我有 Sqoop 版本:1.4.6

将数据从 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 了解详情。