Hadoopとリレーショナル・データベース間のSqoopのデータ転送

3221 ワード

sqoopはインクリメンタルインポートをサポート
jobの表示:
    sqoop job --meta-connect jdbc:hsqldb:hsql://ip:port/sqoop --list

mysqlのテーブル構造をhiveテーブルにコピーします.
    sqoop create-hive-table --connect jdbc:mysql://ip:port/dbName --table tableName --username username --password pass --hive-table qinshiwei

テーブルqinshiweiのデフォルトはdefaultデータベースにあります
mysqlデータインポートhive
    sqoop import --connect jdbc:mysql://ip:port/dbName --username root --password mysql-password --table t1 --hive-import

HDfsデータインポートmysql
    sqoop-export --connect jdbc:mysql://ip:port/dbName --username username --password pass --table qinshiwei --export-dir tablename

export-dirは、エクスポートするHDFSフラットファイルの場所です.絶対パスでない場合は、/user/username/datadirを指します.
パラメータ:--input-fields-terminated-by'0001'
mysqlインポートhdfsファイルセパレータ:--fields-terminated-by'0001'
mysqlインポートhdfs:
    sqoop import --connect jdbc:mysql://Hadoop48/toplists --username root --table test -m 1

mysqlインポートhive:
    sqoop import --connect jdbc:mysql://ip/tjcommon --verbose -m 1 --username username --password pass --hive-overwrite --direct --table tablename --hive-import --create-hive-table --hive-table mysql_award --fields-terminated-by '\t' --lines-terminated-by '
' --append

コマンドを実行する前にhadoopの下のテーブル名を削除します.JAvaファイルrm/usr/lib/hadoop-0.20/tablename.JAva,保証テーブル名mysql_awardはhiveのdefaultデータベースに存在しません.
    sqoop import --connect jdbc:mysql://ip/dbName --username username --password pass --table qinshiwei -m 1 --hive-import --hive-table err --hive-overwrite --hive-delims-replacement "\t" --incremental append --last-value 0 --check-column id

hive空値処理
sqoopはNULLをnull処理に自動的に変換しますが、hiveではデフォルトでnullを表すためにNが使用されます.事前処理は有効ではありません.--null-stringと--null-non-stringを使用して空の値を処理してNを\Nに変換する必要があります.
    sqoop import  ... --null-string '\\N' --null-non-string '\\N'

Sqoopがhiveをインポートhive-overwirteを追加しないとhadoopディレクトリが残り、次回同じタスクを実行する場合に影響します.
--incremental append 
 --check-column id
--last-value 0 
これでsqoopはvisit_からlogではidが0より大きいidがインポートを開始し,インクリメンタルインポートを実現した.非インクリメンタルインポートは使用できますが、sqoopではwarehouse-dirディレクトリの下にソーステーブル名のディレクトリが作成されるようです.このディレクトリがあるとエラーが表示されるので、インクリメンタルインポートを推奨します.
毎日インポート時のlast value値が異なり、毎日動的に新しいlast valueを読み込むにはどうすればいいですか?sqoopは、sqoopコマンドをjobに変更することをサポートし、sqoopはjob結果によってlast valueの値を自動的に交換します.
最後に得られたsqoopコマンドは次のとおりです.
sqoop job visit_import --create -- import  --connect jdbc:mysql://localhost:3306/main  --username root  --password pass --table user --columns "id,url,time" --direct --hive-import   --hive-table hive_visit_log --incremental append  --check-column id --last-value 0 

sqoop job --exec visit_import

jobを作成するには:
    sqoop job --meta-connect jdbc:hsqldb:hsql://ip:port/sqoop --create visit_import -- import --connect jdbc:mysql://ip:port/dbname --username username --password pass --table table --direct --hive-import --hive-table mysql_award --incremental append --check-column id --last-value 0