云服务器内容精选

  • 举例 在Rest Client节点的参数“URL参数”中使用EL表达式“tableName=#{JSONUtil.path(Job.getNodeOutput("get_cluster"),"tables[0].table_name")}”,如图1所示。 表达式说明如下: 获取作业中“get_cluster”节点的执行结果(“Job.getNodeOutput("get_cluster")”),执行结果是一个JSON字符串。 通过JSON路径(“tables[0].table_name”),获取JSON字符串中字段的值。 图1 表达式示例 EL表达式在数据开发过程中被广泛应用,您可以参考最佳实践查看更多应用EL表达式的进阶实践。
  • 调试方法介绍 下面介绍几种EL表达式的调试方法,能够在调试过程中方便地看到替换结果。 后文以#{DateUtil.now()}表达式为例进行介绍。 使用DIS Client节点。 前提:您需要具备DIS通道。 方法:选择DIS Client节点,将EL表达式直接写在要发送的数据中,单击“测试运行”,然后在节点上右键查看日志,日志中会把EL表达式的值打印出来。 使用Kafka Client节点。 前提:您需要具备MRS集群,且集群有Kafka组件。 方法:选择Kafka Client节点,将EL表达式直接写在要发送的数据中,单击“测试运行”,然后在节点上右键查看日志,日志中会把EL表达式的值打印出来。 使用Shell节点。 前提:您需要具备ECS弹性云服务器。 方法:创建一个主机连接,将EL表达式直接通过echo打印出来,单击“测试运行”之后查看日志,日志中会打印出EL表达式的值。 使用Create OBS节点。 如果上述方法均不可用,则可以通过Create OBS去创建一个OBS目录,目录名称就是EL表达式的值,单击“测试运行”后,再去OBS界面查看创建出来的目录名称。
  • 方法 表1 方法说明 方法 描述 示例 String format(Date date, String pattern) 将Date类型时间按指定pattern格式为字符串。 将作业调度计划的时间,转换为毫秒格式。 #{DateUtil.format(Job.planTime,"yyyy-MM-dd HH:mm:ss:SSS")} 将作业调度计划减一天的时间,转换为周格式。 #{DateUtil.format(DateUtil.addDays(Job.planTime,-1),"yyyyw")} Job.planTime为2024年1月7日时,返回值为20241。 #{DateUtil.format(DateUtil.addDays(Job.planTime,-1),"yyyyww")} Job.planTime为2024年1月7日时,返回值为202401。 Date addMonths(Date date, int amount) 给date添加指定月数后,返回新Date对象,amount可以是负数。 将作业调度计划减一个月的时间,转换为月份格式。 #{DateUtil.format(DateUtil.addMonths(Job.planTime,-1),"yyyy-MM")} Date addDays(Date date, int amount) 给date添加指定天数后,返回新Date对象,amount可以是负数。 将作业调度计划减一天的时间,转换为年月日格式。 #{DateUtil.format(DateUtil.addDays(Job.planTime,-1),"yyyy-MM-dd")} 将作业调度计划减一天的时间,转换为周格式。 #{DateUtil.format(DateUtil.addDays(Job.planTime,-1),"yyyyw")} Job.planTime为2024年1月7日时,返回值为20241。 #{DateUtil.format(DateUtil.addDays(Job.planTime,-1),"yyyyww")} Job.planTime为2024年1月7日时,返回值为202401。 Date addHours(Date date, int amount) 给date添加指定小时数后,返回新Date对象,amount可以是负数。 将作业调度计划减一小时的时间,转换为小时格式。 #{DateUtil.format(DateUtil.addHours(Job.planTime,-1),"yyyy-MM-dd HH")} Date addMinutes(Date date, int amount) 给date添加指定分钟数后,返回新Date对象,amount可以是负数。 将作业调度计划减一分钟的时间,转换为分钟格式。 #{DateUtil.format(DateUtil.addMinutes(Job.planTime,-1),"yyyy-MM-dd HH:mm")} int getDay(Date date) 从date获取天,例如:date为2018-09-14,则返回14。 从作业调度计划获取具体的天。 #{DateUtil.getDay(Job.planTime)} int getMonth(Date date) 从date获取月,例如:date为2018-09-14,则返回9。 从日期获取具体的月。 #{DateUtil.getMonth(Job.planTime)} int getQuarter(Date date) 从date获取季度,例如:date为2018-09-14,则返回3。 从日期获取具体的季度。 #{DateUtil.getQuarter(Job.planTime)} int getYear(Date date) 从date获取年,例如:date为2018-09-14,则返回2018。 从日期获取具体的年。 #{DateUtil.getYear(Job.planTime)} Date now() 返回当前时间。 以秒格式返回当前的时间。 #{DateUtil.format(DateUtil.now(),"yyyy-MM-dd HH:mm:ss")} long getTime(Date date) 将Date类型时间转换为long类型时间戳。 将作业调度计划时间转换为时间戳。 #{DateUtil.getTime(Job.planTime)} Date parseDate(String str, String pattern) 字符串按pattern转换为Date类型,pattern为日期、时间模式,请参考日期和时间模式。 将字符串类型的作业启动时间转换为秒格式。 #{DateUtil.parseDate(Job.getPlanTime("yyyy-MM-dd HH:mm:ss:SSS"),"yyyy-MM-dd HH:mm:ss")}
  • 属性和方法 表1 属性说明 属性 类型 描述 name String 作业名称。 planTime java.util.Date 作业调度计划时间,即周期调度配置的时间,例如每天凌晨1:01调度作业。 startTime java.util.Date 作业执行时间,有可能与planTime同一个时间,也有可能晚于planTime(由于作业引擎繁忙等)。 eventData String 当作业使用事件驱动调度时,从通道获取的消息。 projectId String 当前数据开发模块所处项目ID。 表2 方法说明 方法 描述 示例 String getNodeStatus(String nodeName) 获取指定节点运行状态,成功状态返回success,失败状态返回fail。 例如,判断节点是否运行成功,可以使用如下判断条件,其中test为节点名称: #{(Job.getNodeStatus("test")) == "success" } 获取test节点运行状态。 #{Job.getNodeStatus("test")} String getNodeOutput(String nodeName) 获取指定节点的输出。此方法只能获取前面依赖节点的输出。 获取test节点输出。 #{Job.getNodeOutput("test")} 当前一节点执行无结果时,输出结果为“null”。 当前一节点的输出结果是一个字段时,输出结果形如[["000"]]所示。此时可通过EL表达式分割字符串结果,获取前一节点输出的字段值,但注意输出结果类型为String。需要输出原数据类型时,仍需通过For Each节点及其支持的Loop内嵌对象EL表达式获取。 #{StringUtil.split(StringUtil.split(StringUtil.split(Job.getNodeOutput("前一节点名"),"]")[0],"[")[0],"\\"")[0]} 当前一节点的输出结果是多个(两个及以上)字段时,输出结果形如[["000"],["001"]]所示。此时需要结合For Each节点及其支持的Loop内嵌对象EL表达式如#{Loop.current[0]},循环获取输出结果,详见获取SQL节点的输出结果值。 String getParam(String key) 获取作业参数。 注意此方法只能直接获取当前作业里配置的参数值,并不能获取到父作业传递过来的参数值,也不能获取到工作空间里面配置的全局变量,作用域仅为本作业。 这种情况下建议使用表达式${job_param_name},既可以获取到父作业传递过来的参数值,也可以获取到全局配置的变量。 获取参数test的值: #{Job.getParam("test")} String getPlanTime(String pattern) 获取指定pattern的计划时间字符串,pattern为日期、时间模式,请参考日期和时间模式。 获取作业调度计划时间,具体到毫秒: #{Job.getPlanTime("yyyy-MM-dd HH:mm:ss:SSS")} String getYesterday(String pattern) 获取执行pattern的计划时间前一天的时间字符串,pattern为日期、时间模式,请参考日期和时间模式。 获取作业调度计划时间的前一天的时间,具体到日期: #{Job.getYesterday("yyyy-MM-dd HH:mm:ss:SSS")} String getLastHour(String pattern) 获取执行pattern的计划时间前一小时的时间字符串,pattern为日期、时间模式,请参考日期和时间模式。 获取作业调度计划时间前一小时的时间,具体到小时: #{Job.getLastHour("yyyy-MM-dd HH:mm:ss:SSS")} String getRunningData(String nodeName) 获取指定节点运行中记录的数据,当前只支持获取DLI SQL节点SQL语句运行的作业id。此方法只能获取前面依赖节点的输出。 例如,想要获取DLI节点第3条语句的job ID(DLI节点名为DLI_INSERT_DATA),可以这样使用:#{JSONUtil.path(Job.getRunningData("DLI_INSERT_DATA"),"jobIds[2]")}。 获取指定DLI SQL节点test中第三条语句的job ID: #{JSONUtil.path(Job.getRunningData("test"),"jobIds[2]")} String getInsertJobId(String nodeName) 返回指定DLI SQL或Transform Load节点第一个Insert SQL语句的作业ID,不指定参数nodeName时,获取前面一个节点第一个DLI Insert SQL语句的作业ID,如果无法获取到作业ID,返回null值。 获取DLI SQL节点test中第一个Insert SQL语句的job ID: #{Job.getInsertJobId("test")} String getPreviousWorkday(Integer num, String pattern) 按照指定的pattern返回计划时间前第num个工作日的时间字符串,num只可为正整数。若没有获取到符合条件的结果则返回null值。 该EL表达式适用于按照日历选择自定义日期进行周期调度。 获取前五天的工作日的日期。 #{Job.getPreviousWorkday(5, "yyyyMMdd")} String getPreviousNonWorkday(Integer num, String pattern) 按照指定的pattern返回计划时间前第num个非工作日的时间字符串,num只可为正整数。若没有获取到符合条件的结果则返回null值。 该EL表达式适用于按照日历选择自定义日期进行周期调度。 获取前一天的非工作日的日期。 #{Job.getPreviousNonWorkday(1, "yyyyMMdd")}