sqoop如何将sql数据类型转换为配置单元

时间:2017-03-25 07:57:11

标签: sql-server hive sqoop

我需要在sqoop中转换为hive的完整SQL Server数据类型列表。

与SQL Server timestamp转换为配置单元string一样,SQL Server varchar将转换为配置单元string等。

我在哪里可以找到这个完整的映射?

2 个答案:

答案 0 :(得分:3)

用于Java映射

SELECT * FROM <TABLE-NAME> WHERE 1=0

使用查询。除了元数据之外,它不会获取任何记录。

有用的来源code

  protected String getColNamesQuery(String tableName) {
    // adding where clause to prevent loading a big table
    return "SELECT t.* FROM " + escapeTableName(tableName) + " AS t WHERE 1=0";
  }

然后它使用ResulSetMetadata来查找数据类型。

通用JDBC的有用源code

  int cols = results.getMetaData().getColumnCount();
  ArrayList<String> columns = new ArrayList<String>();
  ResultSetMetaData metadata = results.getMetaData();
  for (int i = 1; i < cols + 1; i++) {
    String colName = metadata.getColumnLabel(i);
    if (colName == null || colName.equals("")) {
      colName = metadata.getColumnName(i);
      if (null == colName) {
        colName = "_RESULT_" + i;
      }
    }
    columns.add(colName);
    LOG.debug("Found column " + colName);

此映射会覆盖--map-column-java的映射。

适用于Hive制图

使用此映射:

 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;
      }
  }

检查源代码here

此映射会覆盖--map-column-hive的映射。

答案 1 :(得分:1)

Sqoop预先配置为将大多数SQL类型映射到适当的Java或Hive代表。但是,默认映射可能不适合所有人,可能会被覆盖。

sqoop import ... --map-column-java id=String,value=Integer

请参阅Sqoop用户指南:https://sqoop.apache.org/docs/1.4.3/SqoopUserGuide.html#_controlling_type_mapping

另外一些配置属性可能会影响类型映射,例如sqoop.bigdecimal.format.string

您可能需要学习源代码以获取完整的预配置映射列表。但是将它们指定为--map-column-java或--map-column-hive可以让您获得更多控制权。您可以从目标表元数据生成映射。