簡體   English   中英

Sqoop增量加載lastmodified不能處理更新的記錄

[英]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 --appendlastmodified 這不正確。

  • --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

  1. 我知道,只要源MySQL表中發生更改,您就會嘗試更新HDFS中的現有記錄。
  2. 只有當您不想更新源表中更改的記錄時,才應使用--append。
  3. 另一種方法是您可以嘗試將更改的記錄作為delta_records遷移到單獨的目錄中,然后將其與base_records連接。 請參閱hortonworks 鏈接以獲得更清晰的信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM