永久存储sqoop—db2的Map列配置单元Map

avkwfej4  于 2021-06-03  发布在  Sqoop
关注(0)|答案(1)|浏览(444)

我正在导入几个带有oozie工作流的db2数据库表,该工作流使用sqoop导入到hive。目前,我必须用“-map column hive”手动Map每个数据类型不受支持的列。
有没有办法永久存储特定数据类型的Map?我正在导入几个表,其中包含db2“character”列,这些列都必须手动Map到配置单元“string”。对于~50个表,有~200个列使用fks的数据类型“character”,必须手动Map。
我想永久保存db2-“character”Map到数据类型hive-“string”。这能做到吗?
当做

dzjeubhm

dzjeubhm1#

据我所知,sqoop不提供将类型到类型Map作为参数传递的能力。
它们都是显式硬编码的:

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

对于db2中的xml列,还有一个特定的例子:

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

如果此Map无法识别列类型+通过 --map-column-hive 参数,则会出现异常。
在您的情况下我会做什么(如果不考虑手动列Map):
再次确保db2的类型Map——“character”不起作用
下载sqoop版本的源代码,在中添加一个新的if分支 Db2Manager.toDbSpecificHiveType ,使用一些表进行构建和测试
创建一个pr并等待下一个版本,或者使用定制的sqoop版本(当您想要升级sqoop版本时可能会很痛苦)

相关问题