如何将mysql ddl转换为hive ddl

dgsult0t  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(695)

给定一个包含ddl的sql脚本,用于在mysql数据库中创建表,我想将该脚本转换为hiveddl,以便可以将表创建到hive中。我本可以自己编写一个解释器,但我认为可能会遗漏一些细节(例如数据格式转换、int、bigint、时间、日期等),因为我对hiveddl非常陌生。
我看过这个线程如何将mysql表传输到hive?,它提到了sqoophttp://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;

输出配置单元ddl如下所示:

CREATE TABLE user_keyword (
  username string,
  keyword_id int,
);
1cklez4t

1cklez4t1#

或者,可以使用createhivetable工具来实现这一点。“创建配置单元表”工具使用基于先前导入到hdfs的数据库表或计划导入的数据库表的表定义来填充配置单元元存储。这将有效地执行sqoop import的--hive import步骤,而不运行前面的导入。例如,
sqoop创建配置单元表--连接jdbc:mysql用法://localhost/demo-username root--table t2--以“,”结尾的字段--hive table t2
此命令将基于mysql中同一表的模式创建一个空hive表t2,而不导入数据。

7z5jn7bk

7z5jn7bk2#

实际上我认为这是不受支持的,但是在查看了源代码之后,我在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");
  }
}

所以基本上您应该只能使用这个选项生成ddl --generate-only 与…结合使用 --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

相关问题