永久存储DB2的sqoop --map-column-hive映射

时间:2020-07-12 12:26:39

标签: hive db2 sqoop oozie

我正在使用Oozie工作流程导入几个DB2数据库表,该工作流程使用Sqoop导入到Hive。目前,我必须使用“ --map-column-hive”手动将每个列映射为不受支持的数据类型。

有什么方法可以永久存储特定数据类型的映射?我正在导入几个包含DB2-“ Character”列的表,所有这些表都必须手动映射到HIVE-“ STRING”。 对于约50个表,有约200列使用FK数据类型为“字符”,必须手动进行映射。

我想永久保存DB2-“字符”被映射到数据类型HIVE-“ STRING”。 能做到吗?

致谢

1 个答案:

答案 0 :(得分:1)

据我所知,Sqoop没有提供将类型间映射作为参数传递的功能。
它们都是hardcoded explicitly

switch (sqlType) {
  case Types.INTEGER:
  case Types.SMALLINT:
      return HIVE_TYPE_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 HIVE_TYPE_STRING;
  case Types.NUMERIC:
  case Types.DECIMAL:
  case Types.FLOAT:
  case Types.DOUBLE:
  case Types.REAL:
      return HIVE_TYPE_DOUBLE;
  case Types.BIT:
  case Types.BOOLEAN:
      return HIVE_TYPE_BOOLEAN;
  case Types.TINYINT:
      return HIVE_TYPE_TINYINT;
  case Types.BIGINT:
      return HIVE_TYPE_BIGINT;
  default:
  // TODO(aaron): Support BINARY, VARBINARY, LONGVARBINARY, DISTINCT,
  // BLOB, ARRAY, STRUCT, REF, JAVA_OBJECT.
      return null;
}

还有XML columns in DB2的特殊情况:

if (colTypeName.toUpperCase().startsWith("XML")) {
  return XML_TO_JAVA_DATA_TYPE;
}

如果此映射+用户定义的映射无法通过识别您的列类型 --map-column-hive参数,您将获得异常。

在您的情况下我该怎么做(如果不考虑手动列映射的话):

  1. 再次确保DB2-“字符”的类型映射不起作用
  2. 下载Sqoop版本的源代码,在Db2Manager.toDbSpecificHiveType中添加一个新的if分支,使用一些表进行构建和测试
  3. 创建PR,然后等待下一个版本,或者使用Sqoop的自定义版本(如果要升级Sqoop版本,可能会很痛苦)