【问题标题】:Passing date parameter to sqoop import into Hive table将日期参数传递给 sqoop 导入 Hive 表
【发布时间】:2019-01-09 16:54:55
【问题描述】:

我正在使用 sqoop 导入语句将一组表从 Oracle 数据库导入 Hive,如下所示:

sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" --connect CONNECTIONSTRING --table TABLENAME --username USERNAME --password PASSWORD --hive-import --hive-drop-import-delims - -hive-overwrite --hive-table HIVE_TABLE_NAME1 --null-string '\N' --null-non-string '\N' -m 1

我在此 sqoop 语句中使用以下检查列关键字进行增量加载:

--check-column COLUMN_NAME --incremental lastmodified --last-value HARDCODED_DATE

我对此进行了测试,效果很好,但我想对其进行修改,使其成为动态的,我不必将日期硬编码到语句中,我可以将它作为参数传递,以便它检查指定的列和获取该日期之后的所有数据。我知道日期必须从不同的文件传递,但我不确定文件的结构应该是什么以及它将如何引用这个 sqoop 语句。任何帮助或指导将不胜感激。提前谢谢!

【问题讨论】:

    标签: oracle import hive sqoop


    【解决方案1】:

    您也可以使用 sqoop 作业。

    使用 sqoop 作业,你必须将 last-value 应用为 0,它会导入和更新作业中的数据,所以你只需要运行 sqoop-job --exec ,它会更新数据而无需任何硬编码值。

    sqoop job create <<job_name>> -- import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" --connect <<db_url>> --table <<db_name>> --username <<username>> --password <<password>> --hive-import --hive-drop-import-delims --hive-overwrite --hive-table <<hive_table>> --null-string '\N' --null-non-string '\N' -m 1 --incremental lastmodified --check-column timedate --last-value 0
    
    sqoop job --exec <<job_name>>
    

    更多详情请访问https://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_literal_sqoop_job_literal

    【讨论】:

    • 您好,我知道我将此答案标记为正确,并且当我先硬编码日期然后从下一次运行时它会自动运行时,它工作正常。但是当我将最后一个值更改为 0 时,它给了我一个错误,说输入值对于日期格式来说不够长
    • 最后一个值应该与您选择的列类型相同,即如果您的列类型是日期时间,那么最后一个值应该是 0000-00-00 00:00:00。如果它不起作用,请告诉我。
    • 使用 00 代替月份,给出错误提示“00 不是为月份提供的有效值”但是我能够通过使用我的 oracle 中的第一个最后更新日期来解决问题表。
    猜你喜欢
    • 1970-01-01
    • 2015-05-06
    • 2019-11-19
    • 2019-04-15
    • 1970-01-01
    • 2016-08-07
    • 2017-02-03
    • 2016-04-26
    • 2019-07-12
    相关资源
    最近更新 更多