更新時(shí)間:2021年01月26日18時(shí)24分 來(lái)源:傳智教育 瀏覽次數(shù):
當(dāng)MySQL表中的數(shù)據(jù)發(fā)生了新增或修改變化,需要更新HDFS上對(duì)應(yīng)的數(shù)據(jù)時(shí),就可以使用Sqoop的增量導(dǎo)入功能。Sqoop目前支持兩種增量導(dǎo)入模式:append模式和lastmodified模式。其中,append模式主要針對(duì)INSERT新增數(shù)據(jù)的增量導(dǎo)入;lastmodified模式主要針對(duì)UPDATE修改數(shù)據(jù)的增量導(dǎo)入。
在進(jìn)行增量導(dǎo)入操作時(shí),首先必須指定“--check-column”參數(shù),用來(lái)檢查數(shù)據(jù)表列字段,從而確定哪些數(shù)據(jù)需要執(zhí)行增量導(dǎo)入。例如,在執(zhí)行append模式增量導(dǎo)入時(shí),通常會(huì)將“--check-column”參數(shù)指定為具有連續(xù)自增功能的列(如主鍵id);而執(zhí)行l(wèi)astmodified模式增量導(dǎo)入時(shí),通常會(huì)將“--check-column”參數(shù)必須指定為日期時(shí)間類(lèi)型的列(如date或timestamp類(lèi)型的列)。
同時(shí),還可以為增量導(dǎo)入操作指定“--last-value”參數(shù),用于只增量導(dǎo)入last-value值以后的記錄數(shù)據(jù),然后存儲(chǔ)到之前HDFS上相應(yīng)目錄下的一個(gè)單獨(dú)文件中。否則,會(huì)導(dǎo)入原表中所有數(shù)據(jù)到HDFS上相應(yīng)目錄下的一個(gè)單獨(dú)文件中。
為了演示增量導(dǎo)入操作,首先向emp表添加新數(shù)據(jù),指令如下所示。
INSERT INTO `emp` VALUES ('1206', 'itcast', 'java dev', '50000', 'AC');接下來(lái),就針對(duì)emp表數(shù)據(jù)的新增變化執(zhí)行append模式的增量導(dǎo)入,具體指令示例如下。
$ sqoop import \ --connect jdbc:mysql://hadoop01:3306/userdb \ --username root \ --password 123456 \ --target-dir /sqoopresult \ --table emp \ --num-mappers 1 \ **--incremental append** \ **--check-column id** \ **--last-value 1205
上述增量導(dǎo)入的操作指令與10.4.1小節(jié)所示的指令基本相同,為了實(shí)現(xiàn)增量導(dǎo)入功能,新添加了三個(gè)參數(shù)。其中,“--incremental append”指定了使用增量導(dǎo)入的模式為append;“--check-column id”指定了針對(duì)表emp數(shù)據(jù)的id主鍵進(jìn)行檢查;“--last-value 1205”指定了針對(duì)id值為1205以后的數(shù)據(jù)執(zhí)行增量導(dǎo)入。
執(zhí)行上述指令后,從HDFS UI界面查看增量導(dǎo)入結(jié)果,如圖1所示。
圖1 增量導(dǎo)入結(jié)果文件
從圖1可以看出,增量導(dǎo)入的數(shù)據(jù)在指定的目標(biāo)目錄下創(chuàng)建了一個(gè)新的結(jié)果文件part-m-00001,可以使用hadoop fs -cat命令查看數(shù)據(jù),如圖2所示。
圖2 增量導(dǎo)入結(jié)果文件內(nèi)容
從圖2可以看出,當(dāng)設(shè)置了“--last-value 1205”參數(shù)后,增量導(dǎo)入的新結(jié)果文件只會(huì)把指定值后的數(shù)據(jù)添加到結(jié)果文件中。
這里只演示了開(kāi)發(fā)中常用的append模式的增量導(dǎo)入操作,讀者也可以根據(jù)說(shuō)明進(jìn)行另一種lastmodified模式增量導(dǎo)入的操作。但需要注意的是,必須保證lastmodified模式增量導(dǎo)入的數(shù)據(jù)具有日期時(shí)間類(lèi)型的列字段。
猜你喜歡:
北京校區(qū)