1

MySQLデータベースにテーブルを作成するためのDDLを含むSQLスクリプトがある場合、テーブルをHiveに作成できるように、スクリプトをHiveDDLに変換したいと思います。自分でインタプリタを作成することもできましたが、ハイブDDLを初めて使用するため、詳細(データ形式の変換、int、bigint、時刻、日付など)が欠落している可能性があると考えました。

私はこのスレッドを見ましたmysqlテーブルをハイブに転送する方法は?、sqoophttp : //archive.cloudera.com/cdh/3/sqoop/SqoopUserGuide.htmlについて言及しました。ただし、私が見たところ、sqoopは確かにDDLを変換しますが、これは中間ステップとしてのみです(したがって、変換されたDDLはどこにも見つかりません)。MySQL DDLを入力として翻訳を出力するコマンドがありませんか?

たとえば、私のMySQLDDLは次のようになります。

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;

そして、出力HiveDDLは次のようになります。

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

2 に答える 2

2

私は実際にはこれがサポートされていないと思っていましたが、ここでソースを見た後、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したがって、基本的には、との結合で使用されるオプションを使用して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の同じテーブルのスキーマに基づいて空白のハイブテーブルt2を作成します。

于 2014-04-21T21:57:57.127 に答える