我正在尝试将数据从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"
最终输出应该是大于最后一个值的数据,但在上面的情况下,它会附加数据而不是逐步更新数据。
我希望更新数据而不是附加数据。
答案 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 \
中找到