Sqoop:增量导入问题

时间:2014-07-17 01:35:25

标签: mysql hadoop sqoop

我有一个要求,其中我需要逐步将表从mysql导入到hive,并且在执行此操作时遇到问题。 这是我到目前为止所尝试的:

  1. 我创建了一个使用下面提到的查询导入表的作业。
  2. / sqoop job

    --create test2 -- import 
    --connect jdbc:mysql://URL
    --username username 
    --password password 
    --table mysqlTablename 
    --hive-import
    --hive-overwrite
    --direct 
    --incremental lastmodified 
    --check-column last_modified_time 
    --last-value 0
    

    首次执行:按照预期的最小边界导入所有内容为' 0'和最大边界作为当前时间。 第二次执行:拾取上次运行的所有更改,但旧行被覆盖,只留下上次运行中已更改的行。

    1. 我删除了--hive-overwrite和--hive-import选项并使用了' - target-dir'选项。 第一次执行:按照预期的最小边界获取所有内容为' 0'并且最大边界为当前时间,但由于未更新Metastore,因此不会显示在Hive中。 第二次执行:它抛出一个错误,说明作为--target-dir选项的参数提到的directoty已经存在。这是在从HDFS中删除直接文件后执行的,但无法解决问题。
    2. 我发现这是一个问题,除了将新值放入一个副目录并在数据上运行sqoop merge以展平它之外,还没有找到解决方案。我想在shell脚本中自动执行此操作,并且想知道是否有更好的功能 处理此增量更新的方法。

      想要检查什么是最佳选项,我需要导入一个mysql表,并根据带有最后修改时间戳的列逐步更新更改到hive。 即根据mysql中的更改创建,更新或删除Hive表中的行,以使它们保持同步。

      非常感谢任何帮助。

      此致 罗希特夏尔

2 个答案:

答案 0 :(得分:1)

基于配置单元的系统很难处理涉及记录更新的增量加载。这个link将提供更多可行的解决方案。

答案 1 :(得分:1)

使用append命令代替lastmodified来持续获取更新。

例如:

--create test2 -- import 
--connect jdbc:mysql://URL
--username username 
--password password 
--table mysqlTablename 
--hive-import
--direct 
--incremental append 
--check-column last_modified_time 
--last-value "0"