![](/img/trans.png)
[英]How do I sync a mysql table to a hive table ? (sqoop --incremental lastmodified hive imports is not supported)
[英]Sqoop incremental load lastmodified not working on updated records
我正在開發一個sqoop增量作業來將數據從mysql加載到hdfs。 以下是以下方案。
場景1:下面是在mysql中的示例表中插入的記錄。
select * from sample;
+-----+--------+--------+---------------------+
| id | policy | salary | updated_time |
+-----+--------+--------+---------------------+
| 100 | 1 | 4567 | 2017-08-02 01:58:28 |
| 200 | 2 | 3456 | 2017-08-02 01:58:29 |
| 300 | 3 | 2345 | 2017-08-02 01:58:29 |
+-----+--------+--------+---------------------+
下面是mysql中示例表的表結構:
create table sample (id int not null primary key, policy int, salary int, updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
我正在嘗試通過創建一個sqoop作業將其導入hdfs,如下所示
sqoop job --create incjob -- import --connect jdbc:mysql://localhost/retail_db --username root -P --table sample --merge-key id --split-by id --target-dir /user/cloudera --append --incremental lastmodified --check-column updated_time -m 1
執行sqoop job后,下面是hdfs中的輸出記錄。
$ hadoop fs -cat /user/cloudera/par*
100,1,4567,2017-08-02 01:58:28.0
200,2,3456,2017-08-02 01:58:29.0
300,3,2345,2017-08-02 01:58:29.0
場景2:插入少量新記錄並更新樣本表中的現有記錄。 以下是樣本表。
select * from sample;
+-----+--------+--------+---------------------+
| id | policy | salary | updated_time |
+-----+--------+--------+---------------------+
| 100 | 6 | 5638 | 2017-08-02 02:01:09 |
| 200 | 2 | 7654 | 2017-08-02 02:01:10 |
| 300 | 3 | 2345 | 2017-08-02 01:58:29 |
| 400 | 4 | 1234 | 2017-08-02 02:01:17 |
| 500 | 5 | 6543 | 2017-08-02 02:01:18 |
+-----+--------+--------+---------------------+
在運行下面相同的sqoop作業之后是hdfs中的記錄。
hadoop fs -cat /user/cloudera/par*
100,1,4567,2017-08-02 01:58:28.0
200,2,3456,2017-08-02 01:58:29.0
300,3,2345,2017-08-02 01:58:29.0
100,6,5638,2017-08-02 02:01:09.0
200,2,7654,2017-08-02 02:01:10.0
400,4,1234,2017-08-02 02:01:17.0
500,5,6543,2017-08-02 02:01:18.0
這里mysql中更新的記錄作為新記錄插入到hdfs中,而不是更新hdfs中的現有記錄。 我在我的sqoop job conf中使用了--merge-key和--append。 可以幫助我解決這個問題。
您正在使用--merge-key
--append
和lastmodified
。 這不正確。
--incremental append
mode將數據附加到HDFS中的現有數據集。 您應該在導入表時指定追加模式,其中不斷添加新行並增加行ID值
--incremental lastmodified
mode - 當源表的行可以更新時,您應該使用它,並且每次這樣的更新都會將最后修改的列的值設置為當前時間戳。
--merge-key
- 合並工具運行MapReduce作業,該作業將兩個目錄作為輸入:較新的數據集和較舊的數據集。 這些分別用--new-data和--onto指定。 MapReduce作業的輸出將放在--target-dir
指定的HDFS --target-dir
。
--last-value
(value)指定上一次導入的檢查列的最大值。 如果從命令行運行sqoop,沒有Sqoop作業,則必須添加--last-value
參數
在您的情況下,有一些新的記錄,一些記錄也更新,所以你需要使用lastmodified
模式。
您的Sqoop命令將是:
sqoop job --create incjob -- import --connect jdbc:mysql://localhost/retail_db --username root -P --table sample --merge-key id --target-dir /user/cloudera --incremental lastmodified --check-column updated_time -m 1
由於您只指定了一個映射器,因此不需要--split-by
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.