Sqoop —— MySQL表同步到Hive

我們在往數據倉庫中填充數據的第一步,就是要把RDBMS中的表導入到HDFS中。基於MapReduce的Sqoop工具可以很方便的將關係型數據庫中的表導入到Hive、HBase中,並且記錄可以以文本文件(每行一條記錄)存儲,也可以以Avro或SequenceFiles的二進制格式存儲。
 

Sqoop命令

sqoop import \
--connect jdbc:mysql://host:3306/mysqldb?autoReconnect=true&tinyInt1isBit=false&zeroDateTimeBehavior=round \
--username user_name \
--password-file /home/sqoop/password \
--hive-import \
--hive-database hivedb \
--hive-table hivetable \
--query "select id,user_id,user_name from mysql_table where (updated_at >= '2019-04-19 00:00:00') and \$CONDITIONS" \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-drop-import-delims \
--map-column-java id=String,user_id=String,user_name=String
--target-dir /tmp \
--as-parquetfile \
--fields-terminated-by '^' \
-m 1

 

參數詳解

–connect 要連接的服務器和數據庫
–username 數據庫連接用戶名
–password-file 數據庫連接密碼。也可以使用參數–password(直接將密碼寫在參數後面)或-P(控制檯輸入),但是向數據庫提供密碼的安全方式是將密碼保存在用戶目錄下的一個文件中,並賦予400權限。
–hive-import 導入表到Hive
–hive-database 指定要導入的Hive數據倉庫名
–hive-table 指定要導入的Hive表名
–query 導入指定的statement查詢結果
–null-string 對於string類型的列,要轉換成null的字符串。具體含義:因爲在默認情況下,Sqoop會將NULL值導入爲null字符串(“null”),但是Hive使用字符串\N("\N")來表示NULL值,因此謂詞處理將不能正確工作(像is null)。如果希望將MySQL中的NULL導入到Hive之後還同樣是NULL,可添加參數–null-string和–null-non-string。
–null-non-string 對於非string類型的列,要轉換爲null的字符串。含義同上。
–hive-drop-import-delims 如果你的數據庫的行包含具有Hive默認行分隔符(\n和\r字符)或列分隔符(\01字符)的字符串字段,則在Sqoop-import導入時會出現問題。可以使用–hive-drop-import-delims選項在導入時刪除這些字符,以提供與Hive兼容的文本數據。或者也可以使用–hive-delims-replacement選項,使用用戶定義的導入字符替換這些字符。
–map-column-java Sqoop預先配置爲將大多數SQL類型映射到合適的Java或Hive類型,然而,默認的映射並不能適用於所有情況,可以使用–map-column-java選項覆蓋用於將映射更改爲Java或使用–map-column-hive選項覆蓋用於更改Hive映射。
–target-dir MapReduce job指定在HDFS上的輸出目錄
–as-parquetfile 導入數據爲parquet格式的文件
–fields-terminated-by 字段分隔符
-m 控制map任務數量,也就是並行度

更多更詳細的參數可參考Sqoop官方文檔:
http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_connecting_to_a_database_server

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章