一、覆盖导入
例如维度表,每次导入的数据需要覆盖上次导入的数据。
hive-overwrite参数:实现覆盖导入
hive-import参数:表示向hive表导入
hive-table参数:指定目标hive库表
bash
sqoop import \
--connect jdbc:mysql://hadoop1:3306/source?useSSL=false \
--username root \
--password 123456 \
--table customer \
--hive-import \
--hive-table ods.customer \
--hive-overwrite
二、增量导入
sqoop提供增量导入模式,用于只导入比已经导入行新的数据行。
--check-column 在确定应该导入哪些行时,指定被检查的列。
--incremental 指定sqoop怎样确定哪些行是新行。有效值是append、lastmodified
--last-value 指定已经导入数据的被检查列的最大值(第一次需要指定,以后会自动生成)
sqoop支持两种类型的增量导入:append和lastmodified。可以使用--incremental参数指定增量导入的类型。
当被导入表的新行具有持续递增的行id值时,应该使用append模式。指定行id为--check-column的列。sqoop导入那些被检查列的值比--last-value给出的值大的数据行。
sqoop支持的另一个表修改策略叫做lastmodified模式。当源表的数据行可能被修改,并且每次修改都会更新一个last-modified列为当前时间戳时,应该使用lastmodified模式。那些被检查的时间戳比--last-value给出的时间戳新的数据行被导入。
增量导入命令执行后,在控制台输出的最后部分,会打印出后续导入需要使用的last-value,当周期性执行导入时,应该用这种方式指定--last-value参数的值,以确保只导入新的活修改过的数据。可以通过一个增量导入的保存作业自动执行这个过程,这是适合重复执行增量导入的方式。(这个值可以从日志看到)。
1)建立sqoop增量导入作业
bash
sqoop job \
--create myjob_1 \
-- \
import \
--connect "jdbc:mysql://hadoop1:3306/source?useSSL=false&user=root&password=123456" \
--table sales_order \
--columns "order_number,customer_number,pruduct_code,order-date,entry_date,order_amount" \
--where "entry_date<current_date()" \
--hive-import \
--hive-table ods.sales_order \
--incremental append \
--check-columns entry_date \
--last-value '1900-01-01'
说明:
select current_date() 2023-07-12
entry_date是个时间戳 年-月-日 时:分:秒.毫秒
上面的语句建立一个名为myjob_1的sqoop作业。使用--where参数是为了导入前一天的数据。例如,在2点执行此作业,则不会导入0到2点这个两个小时产生的销售订单数据。
2)查看此时作业中保存的last-value,结果如下显示
bash
sqoop job --show myjob_1 | grep last.value
可以看到,last-value的值为初始的'1900-01-01'
3)首次执行作业
bash
sqoop job -exec myjob_1
因为last-value的值为'1900-01-01',所以这次会导入全部数据,查询ods.sals_order,最后结果如下所示
4)查看此时作业中保存的last-value,结果显示如下
bash
sqoop job --show myjob_1 | grep last.value
可以看到,last-value的值为当前最大值'2016-06-30 05:20:47.0'
5)在Mysql该表增加两条数据
一条7月3日,一条7月4日
6)再次执行sqoop作业,因为last-value的值为'2016-06-30 05:20:47'。所以这次只会导入entry_date比'2016-06-30 05:20:47'大的数据
bash
sqoop job -exec myjob_1
7)查看此时作业中保存的last-value,结果如下所示
因为当前为7月4号,所以只导入了7月3号的数据
8)实际生产中在shell脚本里直接写sqoop执行语句就行
bash
sqoop job --exec myjob_1