如何在配置单元服务器操作中将动态日期作为参数传递
How can I pass a dynamic date in a hive server action as a parameter
在 Oozie 中,我在 Hue 中使用了 Hive 操作,同样的操作我使用参数选项来提供日期参数。在这里我想提供动态日期参数,例如昨天和前天。我怎样才能生成这些日期?以及如何作为参数传递。
我的 HQL 是:
CREATE TABLE IF NOT EXISTS tmp_table as
select * from emptable
where day>=${fromdate} and day<=${todate}
我的 HiveServer 操作包含:
一种。脚本
b.每个日期都有两个参数选项,例如 fromdate = , todate =
C。为 HQL 脚本添加了文件选项。
我尝试了什么:
我创建了两个单独的 shell 脚本,它们 returns 日期。
Shell 脚本之一是
#! /bin/bash
FROM_DAY=$(date +%Y-%m-%d -d " - 1 day")
echo "$FROM_DAY"
并且配置单元操作参数变为 fromdate = /user/manishs/Oozie/filter.sh
但是这种方法不起作用并给出了例外情况:
错误:编译语句时出错:失败:ParseException 行 4:11 无法识别表达式规范中 '/' 'user' '/' 附近的输入 (state=42000,code=40000)
NOTE:
如果我将日期传递为: fromdate ='2015-08-01' ,它正在运行并给出结果。
我的问题是如何在配置单元服务器操作中将动态日期作为参数传递。
或者有什么方法可以将动态过滤器传递给查询。
试试这个,
fromdate = $(sh /user/manishs/Oozie/filter.sh)
filter.sh 应该在给定的地方
Oozie 是一个调度器,对吧?那么为什么不使用内置的 EL 函数来计算“今天”和“昨天”并将它们传递给 Hive 操作呢?
在协调器脚本中,假设您使用的是 洛杉矶 时区,它应该看起来像...
<coordinator-app .......>
<action>
<app-path>/path/to/the/worklow/definition</app-path>
<configuration>
<property>
<name>today</name>
<value>${coord:formatTime(coord:dateTzOffset(coord:nominalTime(), "America/Los_Angeles"), 'yyyy-MM-dd')}</value>
</property>
<property>
<name>yesterday</name>
<value>${coord:formatTime(coord:dateOffset(coord:dateTzOffset(coord:nominalTime(), "America/Los_Angeles"), -1, 'DAY'), 'yyyy-MM-dd')}</value>
</property>
</configuration>
</action>
</coordinator-app>
然后在 Workflow 脚本中,使用 <param>
元素将属性传递给 Hive。
参考: Oozie Coordinator documentation
6.7.3. coord:nominalTime() EL Function
6.7.4. coord:actualTime() EL Function
6.9.1. coord:dateOffset(String baseDate, int instance, String timeUnit) EL Function
6.9.2. coord:dateTzOffset(String baseDate, String timezone) EL Function
6.9.3. coord:formatTime(String ts, String format) EL Function
好的,您可能无法使用 Hue 做到这一点。但是 Hue 编辑器有很多限制,无论如何你都不能用它做很多事情。
在 Oozie 中,我在 Hue 中使用了 Hive 操作,同样的操作我使用参数选项来提供日期参数。在这里我想提供动态日期参数,例如昨天和前天。我怎样才能生成这些日期?以及如何作为参数传递。
我的 HQL 是:
CREATE TABLE IF NOT EXISTS tmp_table as
select * from emptable
where day>=${fromdate} and day<=${todate}
我的 HiveServer 操作包含: 一种。脚本 b.每个日期都有两个参数选项,例如 fromdate = , todate = C。为 HQL 脚本添加了文件选项。
我尝试了什么: 我创建了两个单独的 shell 脚本,它们 returns 日期。 Shell 脚本之一是
#! /bin/bash
FROM_DAY=$(date +%Y-%m-%d -d " - 1 day")
echo "$FROM_DAY"
并且配置单元操作参数变为 fromdate = /user/manishs/Oozie/filter.sh
但是这种方法不起作用并给出了例外情况: 错误:编译语句时出错:失败:ParseException 行 4:11 无法识别表达式规范中 '/' 'user' '/' 附近的输入 (state=42000,code=40000)
NOTE:
如果我将日期传递为: fromdate ='2015-08-01' ,它正在运行并给出结果。
我的问题是如何在配置单元服务器操作中将动态日期作为参数传递。 或者有什么方法可以将动态过滤器传递给查询。
试试这个,
fromdate = $(sh /user/manishs/Oozie/filter.sh)
filter.sh 应该在给定的地方
Oozie 是一个调度器,对吧?那么为什么不使用内置的 EL 函数来计算“今天”和“昨天”并将它们传递给 Hive 操作呢?
在协调器脚本中,假设您使用的是 洛杉矶 时区,它应该看起来像...
<coordinator-app .......>
<action>
<app-path>/path/to/the/worklow/definition</app-path>
<configuration>
<property>
<name>today</name>
<value>${coord:formatTime(coord:dateTzOffset(coord:nominalTime(), "America/Los_Angeles"), 'yyyy-MM-dd')}</value>
</property>
<property>
<name>yesterday</name>
<value>${coord:formatTime(coord:dateOffset(coord:dateTzOffset(coord:nominalTime(), "America/Los_Angeles"), -1, 'DAY'), 'yyyy-MM-dd')}</value>
</property>
</configuration>
</action>
</coordinator-app>
然后在 Workflow 脚本中,使用 <param>
元素将属性传递给 Hive。
参考: Oozie Coordinator documentation
6.7.3. coord:nominalTime() EL Function
6.7.4. coord:actualTime() EL Function
6.9.1. coord:dateOffset(String baseDate, int instance, String timeUnit) EL Function
6.9.2. coord:dateTzOffset(String baseDate, String timezone) EL Function
6.9.3. coord:formatTime(String ts, String format) EL Function
好的,您可能无法使用 Hue 做到这一点。但是 Hue 编辑器有很多限制,无论如何你都不能用它做很多事情。