背景信息
SQOOP支持直接從Hive表到RDBMS表的導出操作,也支持HDFS到RDBMS表的操作,
當前需求是從Hive中導出數據到RDBMS,有如下兩種方案:
Ø 從Hive表到RDBMS表的直接導出:
該種方式效率較高,但是此時相當於直接在Hive表與RDBMS表的數據之間做全量、增量和更新對比,當Hive表記錄較大時,或者RDBMS有多個分區表時,無法做精細的控制,因此暫時不考慮該方案。
Ø 從HDFS到RDBMS表的導出:
該方式下需要先將數據從Hive表導出到HDFS,再從HDFS將數據導入到RDBMS。雖然比直接導出多了一步操作,但是可以實現對數據的更精准的操作,特別是在從Hive表導出到HDFS時,可以進一步對數據進行字段篩選、字段加工、數據過濾操作,從而使得HDFS上的數據更“接近”或等於將來實際要導入RDBMS表的數據。在從HDFS導入RDBMS時,也是將一個“小數據集”與目標表中的數據做對比,會提高導出速度。示意圖如下所示:
不同導出模式介紹
全量導出
Ø 應用場景:將Hive表中的全部記錄(可以是全部字段也可以部分字段)導出到目標表。
Ø 實現邏輯:
Ø 使用限制:目標表中不能有與Hive中相同的記錄,一般只有當目標表為空表時才使用該模式進行首次數據導出。
Ø 參數:源表、目標表、導出字段(select的字段)、映射關系(–column后的參數)
Ø 適用的數據庫:Oracle、DB2、SQL Server、PG、MySQL
增量導出
Ø 應用場景:將Hive表中的增量記錄以及有修改的記錄同步到目標表中。
Ø 實現邏輯:
Ø 使用限制:update-key可以是多個字段,但這些字段的記錄都應該是未被更新過的,若該參數指定的字段有更新,則對應記錄的更新不會被同步到目標表中。
Ø 參數:源表、目標表、篩選字段及其取值范圍、導出字段(select的字段)、映射關系(–column后的參數)、更新的參考字段(–update-key后的參數)
Ø 適用的數據庫:Oracle、SQL Server、MySQL
更新導出
Ø 應用場景:將Hive表中的有更新的記錄同步到目標表。
Ø 實現邏輯:
Ø 使用限制:update-key可以是多個字段,但這些字段的記錄都應該是未被更新過的,若該參數指定的字段有更新,則對應記錄的更新不會被同步到目標表中。
Ø 參數:源表、目標表、篩選字段及其取值范圍、導出字段(select的字段)、映射關系(–column后的參數)、更新的參考字段(–update-key后的參數)
Ø 適用的數據庫:Oracle、DB2、SQL Server、PG、MySQL
相關腳本
全量導出
HQL示例:insert overwrite directory ‘/user/root/export/test’ row format delimited fields terminated by ‘,’ STORED AS textfile select F1,F2,F3 from <sourceHiveTable>;
SQOOP腳本:sqoop export --connect jdbc:mysql://localhost:3306/wht --username root --password cloudera --table <targetTable> --fields-terminated-by ',' --columns F1,F2,F3 --export-dir /user/root/export/test
增量導出(insert模式)
HQL示例:insert overwrite directory ‘/user/root/export/test’ row format delimited fields terminated by ‘,’ STORED AS textfile select F1,F2,F3 from <sourceHiveTable> where <condition>;
SQOOP腳本:sqoop export --connect jdbc:mysql://localhost:3306/wht --username root --password cloudera --table <targetTable> --fields-terminated-by ‘,’ --columns F1,F2,F3 --update-key F4 --update-mode allowinsert --export-dir /user/root/export/test
更新導出(update模式)
HQL示例:insert overwrite directory ‘/user/root/export/test’ row format delimited fields terminated by ‘,’ STORED AS textfile select F1,F2,F3 from <sourceHiveTable> where <condition>;
SQOOP腳本:sqoop export --connect jdbc:mysql://localhost:3306/wht --username root --password cloudera --table <targetTable> --fields-terminated-by ‘,’ --columns F1,F2,F3 --update-key F4 --update-mode updateonly --export-dir /user/root/export/test
轉自:https://blog.csdn.net/qq_35495339/article/details/95620740