MySQLからHiveにデータをインポートするためにSqoop(バージョン1.4.4)を使用しています。データは、テーブルの1つのサブセット、つまりテーブルのいくつかの列になります。事前にHiveでテーブルを作成する必要がありますか?または、データをインポートすると、Hiveにない場合、コマンドで指定された名前が作成されますか?
sqoopドキュメント で述べたように、-Hive-importを使用する場合、Hiveテーブルを作成する必要はありません。コマンドの引数
例:
sqoop import --connect jdbc:mysql://mysql_server:3306/db_name --username mysql_user --password mysql_pass --table table_name --Hive-import
また、フルデータインポートを毎日ベースでスケジュールする場合は、-Hive-overwrite引数を検討してください。たとえば、
ようやく問題を解決しました。これには2つのステップが必要です。
外部テーブルの作成:Hiveの外部テーブルは永続的なテーブルの一種であり、Hiveが停止したりサーバーがダウンしたりしても、そのまま残ります。 「EXTERNAL」キーワードは、テーブルタイプを指定するために使用されます。
CREATE EXTERNAL TABLE IF NOT EXISTS HIVEDB.Hive_TABLE1 (DATE_COL DATE,
BIG_INT_COL BIGINT, INT_COL INT, VARCHAR_COL VARCHAR(221), FLOAT_COL FLOAT);
Sqoopを使用してデータをインポートする:「--Hive-create」オプションを使用する代わりに、データのインポート中に作成されたテーブル名を指定します。
sqoop import --connect jdbc:mysql://mysqlhost/mysqldb --username user --password
passwd --query "SELECT table1.date_col, table1.big_int_col, table1.int_col,
table1.varchar_col, table1.float_col FROM MYSQL_TABLE1 AS table1 WHERE
\$CONDITIONS" --split-by table1.date_col --Hive-import
--Hive-table hivedb.Hive_table1 --target-dir Hive_table1_data`
データはHiveに永続的に保存されました。
Hiveにテーブルがない場合でも、sqoop import
が作成します。以下は私のために働きました:
sqoop import --connect jdbc:mysql://localhost/<<dbname>> --username <<YourMySqlUsername>> --password <<YourMySqlpwd>> --table employee --Hive-import --Hive-table employee_1 -m -1
1つ目は、それ以外の場合は機能するEXTERNALテーブルを作成する必要がないことです。2つ目は、上記のソリューションは少し複雑です。
Mysqlスキーマが次のようになっているとします
mysql> describe emp;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| deg | varchar(20) | YES | | NULL | |
| salary | int(11) | YES | | NULL | |
| dept | varchar(20) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
次に、私が行ったようにHiveテーブル、userdbとしてDATABASE、empとしてTABLEを作成する必要があります。
Hive>
CREATE TABLE userdb.emp (
id INT,
name VARCHAR(20),
deg VARCHAR(20),
salary INT,
dept VARCHAR(20))
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
今、それはsqoopスクリプトを実行することです(私はHiveプロンプトを終了しなければなりませんでした)。Hive2を使用していないので、metastore_dbが存在する場所(つまり、使用した同じ作業ディレクトリから)で以下のスクリプトを実行する必要がありました。ハイブ)。いくつかの回避策はこの問題を軽減することができます(私は推測します)。 sqoopスクリプトは
sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root --password root \
--table emp --fields-terminated-by ',' \
--split-by id \
--Hive-import --Hive-table userdb.emp \
--target-dir /emp
コマンドが成功すると、ターゲットディレクトリ、つまり/ empは削除されます。 userdb.empを使用してHiveテーブルを明示的に指定しました
私のhdfsディレクトリ構造
drwxr-xr-x - ubuntu supergroup 0 2016-12-18 13:20 /user/Hive/warehouse/userdb.db/emp
-rwxr-xr-x 3 ubuntu supergroup 28 2016-12-18 13:19 /user/Hive/warehouse/userdb.db/emp/part-m-00000
-rwxr-xr-x 3 ubuntu supergroup 35 2016-12-18 13:20 /user/Hive/warehouse/userdb.db/emp/part-m-00001
-rwxr-xr-x 3 ubuntu supergroup 29 2016-12-18 13:20 /user/Hive/warehouse/userdb.db/emp/part-m-00002
-rwxr-xr-x 3 ubuntu supergroup 31 2016-12-18 13:20 /user/Hive/warehouse/userdb.db/emp/part-m-00003
-rwxr-xr-x 3 ubuntu supergroup 28 2016-12-18 13:20 /user/Hive/warehouse/userdb.db/emp/part-m-00004
ナヤン、おそらくあなたは今までにそれを理解したでしょう。
EXTERNALかどうかに関係なく、HiveテーブルはHDFSに格納されます。
キーワードEXTERNALは、テーブルとそのデータを緩く結び付けるだけです。たとえば、Hive内からEXTERNALテーブルを削除すると、スキーマのみが削除され、HDFSのデータはそのまま残ります。