Sqoop增量导入和更新

时间:2014-08-19 16:36:22

标签: oracle hadoop hive sqoop

我正在尝试将数据从sql导入到hive数据库中。目标是使用sqoop导入将oracle数据库中的更改更新为hive。 sqoop命令如下:

sqoop import -D mapred.child.java.opts='\-Djava.security.egd=file:/dev/../dev/urandom' 
--connect jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=ON)(FAILOVER=ON)(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1545))(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1545)))(CONNECT_DATA=(SERVICE_NAME=)(SERVER=DEDICATED)))'
 --username abcde  
--password 1234rgtds  
--table Customer_Acc 
--columns Name,ID,Address,Date_booking ,Last_update_date
-m 1
 --target-dir /final/table 
 --hive-import 
--hive-table tesupd 
--map-column-hive Name,ID,Address,Date_booking
 --null-string '\\N' 
--null-non-string '\\N' 
--hive-delims-replacement ' ' 
--incremental lastmodified 
--check-column Last_update_date
--last-value "2009-12-31 12:14:28"

最终输出应该是大于最后一个值的数据,但在上面的情况下,它会附加数据而不是逐步更新数据。

我希望更新数据而不是附加数据。

4 个答案:

答案 0 :(得分:1)

尝试使用--incremental append而不是--incremental last modified。

使用--incremental append提到的字段的last-value存储在sqoop Metastore'incremental.last.value'中,每当执行作业时它都会不断变化。使用--incremental append,您不必更新查询中的last-value,但会自动更新。

这样你的值将永远更新(在sqoop Metastore中)并且不会有任何冗余数据

答案 1 :(得分:1)

sqoop和Hive都不能使用sqoop导入直接更新Hive中的数据。请按照以下链接中的步骤进行行级更新。

http://hortonworks.com/blog/four-step-strategy-incremental-updates-hive/

答案 2 :(得分:1)

--merge-key命令中使用sqoop-import选项。这将用最新记录替换旧记录。

或者您也可以使用sqoop-merge命令,但应该分两步完成。首先sqoop-import没有merge-key,然后是sqoop-merge

答案 3 :(得分:0)

因此,您的数据是可变的,并且您希望在HDFS中修改数据库中已更改的记录。

为此,您需要使用--incremental append标志。您还需要创建一个Sqoop作业,因为这将捕获最新的--last-value并将其序列化回已保存的作业。

您应该创建一个看起来像这样的Sqoop作业。

sqoop job \
--create jobName \
-- \
import \
jdbc:oracle:thin:@hostname:port:sid \
--username user \
--password fileOnHDFS.password \
--table tableName \
--incremental lastmodified \
--check-column UPDATE_DATUM \
--last-value 1985.01.01 \
--merge-key ID \

更多详情可在Sqoop User Guide (v1.4.6)

中找到