web-dev-qa-db-ja.com

Sqoopを使用してMySQLからHiveにデータをインポートする

MySQLからHiveにデータをインポートするためにSqoop(バージョン1.4.4)を使用しています。データは、テーブルの1つのサブセット、つまりテーブルのいくつかの列になります。事前にHiveでテーブルを作成する必要がありますか?または、データをインポートすると、Hiveにない場合、コマンドで指定された名前が作成されますか?

6
Nayan

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引数を検討してください。たとえば、

17

ようやく問題を解決しました。これには2つのステップが必要です。

  1. 外部Hiveテーブルを作成します。
  2. Sqoopを使用してデータをインポートします。

外部テーブルの作成: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に永続的に保存されました。

3
Nayan

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
Subhashini

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
0
Somum

ナヤン、おそらくあなたは今までにそれを理解したでしょう。

EXTERNALかどうかに関係なく、HiveテーブルはHDFSに格納されます。

キーワードEXTERNALは、テーブルとそのデータを緩く結び付けるだけです。たとえば、Hive内からEXTERNALテーブルを削除すると、スキーマのみが削除され、HDFSのデータはそのまま残ります。

0
Dr.Rizz