sqoop如何将sql数据类型转换成hive
How sqoop converts sql datatypes into hive
我需要在 sqoop 中转换为配置单元的 SQL 服务器数据类型的完整列表。
像SQL服务器的timestamp
转成hivestring
,SQL服务器varchar
转成hivestring
等。
在哪里可以找到这个完整的映射?
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 可为您提供更多控制。您可以 来自目标表元数据。
对于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
的映射在此映射上被覆盖。
我需要在 sqoop 中转换为配置单元的 SQL 服务器数据类型的完整列表。
像SQL服务器的timestamp
转成hivestring
,SQL服务器varchar
转成hivestring
等。
在哪里可以找到这个完整的映射?
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 可为您提供更多控制。您可以
对于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
的映射在此映射上被覆盖。