【问题标题】:Permanently store sqoop --map-column-hive mapping for DB2为 DB2 永久存储 sqoop --map-column-hive 映射
【发布时间】:2020-07-12 12:26:39
【问题描述】:

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

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

我想永久保存 DB2-“Character”映射到数据类型 HIVE-“STRING”。 这个可以吗?

问候

【问题讨论】:

    标签: hive db2 sqoop oozie


    【解决方案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-"Character" 的类型映射不起作用
    2. 下载您的 Sqoop 版本的源代码,在 Db2Manager.toDbSpecificHiveType 中添加一个新的 if-branch,使用您的一些表构建和测试
    3. 创建 PR 并等待下一个版本或使用 Sqoop 的自定义版本(当您想升级 Sqoop 版本时可能会很痛苦)

    【讨论】:

    • 非常感谢您的详细回答。我还注意到类型的映射是在 Sqoop 的源代码中完成的。 我的问题不是使用“--map-column-hive”的手动映射不起作用,因为它们完美无缺。我的问题是手动将 ~200 列 与“字符”数据类型映射到 Hive 数据类型“字符串”,这非常麻烦。我目前不愿意使用更改的源代码构建 Sqoop,因为正如您所说,更新将不再正常工作。如果没有人有其他建议,我会接受你的回答(即使它并不能真正解决我的问题)。
    • 还有一个选项 — 为所有 CHARACTER 列创建一个到 collect metadata from DB2 side 的包装脚本,并形成一个字符串作为 map-column-hive 值传递
    猜你喜欢
    • 1970-01-01
    • 2017-12-16
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多