1

给定一个包含用于在 MySQL 数据库中创建表的 DDL 的 SQL 脚本,我想将该脚本转换为 Hive DDL,以便我可以在 Hive 中创建表。我本可以自己编写一个解释器,但我认为我可能会错过一些细节(例如数据格式转换、int、bigint、时间、日期等),因为我对 hive DDL 非常陌生。

我看过这个线程How to transfer mysql table to hive? ,其中提到了 sqoop http://archive.cloudera.com/cdh/3/sqoop/SqoopUserGuide.html。但是,据我所知,sqoop 肯定会翻译 DDL,但只是作为中间步骤(因此无法找到翻译后的 DDL)。我是否错过了以 MySQL DDL 作为输入输出翻译的命令?

例如,我的 MySQL DDL 如下所示:

CREATE TABLE `user_keyword` (
  `username` varchar(32) NOT NULL DEFAULT '',
  `keyword_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`username`,`keyword_id`),
  KEY `keyword_id` (`keyword_id`),
  CONSTRAINT `analyst_keywords_ibfk_1` FOREIGN KEY (`keyword_id`) REFERENCES `keywords` (`keyword_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

输出 Hive DDL 如下:

CREATE TABLE user_keyword (
  username string,
  keyword_id int,
);
4

2 回答 2

2

我实际上认为这是不支持的,但是在查看 Source 之后,我在HiveImport.java中看到了:

/**
 * @return true if we're just generating the DDL for the import, but
 * not actually running it (i.e., --generate-only mode). If so, don't
 * do any side-effecting actions in Hive.
 */
private boolean isGenerateOnly() {
  return generateOnly;
}

/**
 * @return a File object that can be used to write the DDL statement.
 * If we're in gen-only mode, this should be a file in the outdir, named
 * after the Hive table we're creating. If we're in import mode, this should
 * be a one-off temporary file.
 */
private File getScriptFile(String outputTableName) throws IOException {
  if (!isGenerateOnly()) {
    return File.createTempFile("hive-script-", ".txt",
        new File(options.getTempDir()));
  } else {
    return new File(new File(options.getCodeOutputDir()),
        outputTableName + ".q");
  }
}

所以基本上你应该能够只--generate-only使用在 cujunction 中使用的选项生成 DDL,--outdir并且你的表将在指定的输出目录中创建并以你的表命名。

例如,根据您提供的链接:

sqoop import --verbose --fields-terminated-by ',' --connect jdbc:mysql://localhost/test --table employee --hive-import --warehouse-dir /user/hive/warehouse --fields-terminated-by ',' --split-by id --hive-table employee --outdir /tmp/mysql_to_hive/ddl --generate-only

将创建/tmp/mysql_to_hive/ddl/employee.q

于 2013-01-12T03:23:00.063 回答
2

或者,可以使用create-hive-table工具来做到这一点。create-hive-table 工具使用基于先前导入 HDFS 的数据库表或计划导入的数据库表的表定义填充 Hive 元存储。这有效地执行了sqoop-import 的 --hive-import步骤,而无需运行前面的导入。例如,

sqoop create-hive-table --connect jdbc:mysql://localhost/demo -username root --table t2 --fields-terminated-by ',' --hive-table t2

此命令将根据 MySQL 中同一张表的 schema 创建一个空白的 hive 表 t2,而不导入数据。

于 2014-04-21T21:57:57.127 回答