sqoop 導入增量數據到hive


版本

hive:apache-hive-2.1.0

sqoop:sqoop-1.4.6

hadoop:hadoop-2.7.3

導入方式

1.append方式

2.lastmodified方式,必須要加--append(追加)或者--merge-key(合並,一般填主鍵)

創建mysql表並添加數據

-- ----------------------------
-- Table structure for `data`
-- ----------------------------
DROP TABLE IF EXISTS `data`;
CREATE TABLE `data` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` char(20) DEFAULT NULL,
  `last_mod` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of data
-- ----------------------------
INSERT INTO `data` VALUES ('1', '1', '2019-08-28 17:34:51');
INSERT INTO `data` VALUES ('2', '2', '2019-08-28 17:31:57');
INSERT INTO `data` VALUES ('3', '3', '2019-08-28 17:31:58');

先將mysql表數據全部導入hive

sqoop import --connect jdbc:mysql://192.168.0.8:3306/hxy --username root --password 123456 --table data --hive-import --fields-terminated-by ',' -m 1

注意:fields-terminated-by 要是不指定值的話,默認分隔符為'\001',並且以后每次導入數據都要設置 --fields-terminated-by '\001',不然導入的數據為NULL。建議手動設置 --fields-terminated-by的值

 

 

 

成功導入之后,會在HDFS的/soft/hive/warehouse/data看到數據文件

默認生成的hive表為內部表,內部表的數據文件默認保存路徑為/user/hive/warehouse,我在hive-site.xml中,把hive.metastore.warehouse.dir值設成了/soft/hive/warehouse

 

hive表數據

 

 增量導入--append方式導入

官網說append方式下,append 用於自增的 id 列(lastmodified 用於更新的日期列),但是我自己動手發現append方式下,也可以通過時間類型增量導入

官網原文:You should specify append mode when importing a table where new rows are continually being added with increasing row id values. You specify the column containing the row’s id with --check-column. Sqoop imports rows where the check column has a value greater than the one specified with --last-value.

1.last-value是數字類型(推薦)

往mysql插入2條數據

 

--targrt-dir的值設置成hive表數據文件存儲的路徑。假如你的hive表為外部表,則--targrt-dir要指向外部表的存儲路徑
--last-value 3,意味mysql中id為3的數據不會被導入
sqoop import --connect jdbc:mysql://192.168.0.8:3306/hxy \
--username root \
--password 123456 \
--table data \
--target-dir '/soft/hive/warehouse/data' \
--incremental append \
--check-column id \
--last-value 3 \
-m 1

導入成功之后查看數據

 

2.last-value是時間類型(不推薦)

mysql新增2條數據

 執行sqoop命令,按 --check-column last_mod  --last-value '2019-08-30 16:34:02' 條件查找

sqoop import --connect jdbc:mysql://192.168.0.8:3306/hxy \
--username root \
--password 123456 \
--table data \
--target-dir '/soft/hive/warehouse/data' \
--incremental append \
--check-column last_mod \
--last-value '2019-08-30 16:34:02' \
-m 1

查看hive數據(mysql中,時間值為2019-08-30 16:34:02的數據不會被導入)

 

 

增量導入--lastmodified方式導入

lastmodified 用於更新的日期列

1.--incremental lastmodified  --append

將mysql新插入3條數據,並且把id為7的name做了修改

 

執行sqoop命令 (--incremental lastmodified --append方式下,mysql中和--last-value指定的值相等的數據也不會被導入,所以想要讓id為8的數據也導入進去,last-value的值就應該比id為8的數據的時間要小)

 

sqoop import --connect jdbc:mysql://192.168.0.8:3306/hxy \
--username root \
--password 123456 \
--table data \
--target-dir '/soft/hive/warehouse/data' \
--check-column last_mod \ --incremental lastmodified \ --last-value '2019-08-30 16:49:12' \ --m 1 \ --append

結果

 可以看到,7,8,9,10都導入進來了,表中出現了2個id為7的數據,出現了數據重復

--incremental lastmodified  --append的作用:把大於last-value時間的數據都導入進來,之前就存在但是后期修改過的數據並不會進行合並,只會當做新增的數據加進來,所以使用--incremental lastmodified  --append有可能導致數據重復的問題

 

2.--incremental lastmodified  --merge-key

往mysql插入2條數據,並且把id為10的數據做了修改

 

執行sqoop命令(--merge-key的值一般填主鍵,merge-key方式下,mysql中時間和last-value相同的數據會被導入)

sqoop import --connect jdbc:mysql://192.168.0.8:3306/hxy \
--username root \
--password 123456 \
--table data \
--target-dir '/soft/hive/warehouse/data' \
--check-column last_mod \
--incremental lastmodified  \
--last-value '2019-08-30 17:05:49' \
--m 1 \
--merge-key id

結果

 

 

 

 可以看到,新數據11,12都被加了進來,id為10的值做了合並操作,修改后的"10_new"替換了原來的"10",沒有數據重復的現象

並且,id為7的數據也被合並了,可是last-value的值明明比id為7的時間要大,原因是:只要出現id重復的情況,就合並數據,不考慮時間條件。id不為重復的情況下,才會考慮時間條件

 

--incremental lastmodified  --merge-key的作用:修改過的數據和新增的數據(前提是滿足last-value的條件)都會導入進來,並且重復的數據(不需要滿足last-value的條件)都會進行合並

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM