我正在为Oozie安排一个sqoop工作,以便将每日数据加载到Hive中。
我想基于Date作为参数对hive进行增量加载,这将被传递给sqoop作业
经过研究,我无法找到将参数传递给Sqoop作业的方法
答案 0 :(得分:5)
您可以将日期分为两个阶段来完成此操作:
在您的协调员中,您可以将日期传递给它作为<property>
执行的工作流程,如下所示:
<coordinator-app name="schedule" frequency="${coord:days(1)}"
start="2015-01-01T00:00Z" end="2025-01-01T00:00Z"
timezone="Etc/UTC" xmlns="uri:oozie:coordinator:0.2">
...
<action>
<workflow>
<app-path>${nameNode}/your/workflow.xml</app-path>
<configuration>
<property>
<name>workflow_date</name>
<value>${coord:formatTime(coord:nominalTime(), 'yyyyMMdd')}</value>
</property>
</configuration>
</workflow>
</action>
...
</coordinator-app>
在您的工作流程中,您可以使用${workflow_date}
变量在Sqoop调用中引用该属性,如下所示:
<sqoop xmlns="uri:oozie:sqoop-action:0.2">
...
<command>import --connect jdbc:connect:string:here --table tablename --target-dir /your/import/dir/${workflow_date}/ -m 1</command>
...
</sqoop>
答案 1 :(得分:2)
以下解决方案来自Apache Sqoop Cookbook。
保留最后导入的值
<强>问题强>
增量导入是您经常使用的一项很棒的功能。承担记住最后一次进口价值的责任正变得麻烦。
<强>解决方案强>
您可以利用内置的Sqoop Metastore,它允许您保存所有参数以供以后重复使用。您可以使用以下命令创建简单的增量导入作业:
sqoop job \
--create visits 3.3. Preserving the Last Imported Value | 27
-- import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--table visits \
--incremental append \
--check-column id \
--last-value 0
然后使用--exec parameter
:
sqoop job --exec visits
<强>讨论强>
Sqoop Metastore是Sqoop的一个强大功能,它允许您保留您的工作定义并随时轻松运行它们。每个保存的作业都有一个用于引用的逻辑名称。您可以使用--list
参数列出所有保留的作业:
sqoop job --list
您可以删除--delete
参数不再需要的旧作业定义,例如:
sqoop job --delete visits
最后,您还可以使用--show parameter
查看已保存作业定义的内容,例如:
sqoop job --show visits
--show
命令的输出将采用属性的形式。不幸的是,Sqoop目前无法重建您用于创建已保存作业的命令行。
内置Sqoop Metastore最重要的好处是与增量导入相结合。在每次成功增量作业后,Sqoop会自动将最后导入的值序列化回Metastore。这样,用户不需要在每次执行后记住最后导入的值;一切都是自动处理的。