内置时间变量

  1. 用户希望Linkis能够提供一些公共变量然后执行的时候进行替换,比如用户每天都会批量跑同一段sql,需要指定上一天的分区时间,如果基于sql去写会比较复杂如果系统提供一个run_date的变量将会非常方便使用。
  2. 用户希望Linkis支持date pattern计算,支持在代码中写&{YYYY-MM-DD}等变量计算时间变量
  3. 用户希望自己定义变量,比如定一个一个float变量,然后在代码中进行使用

  4. 支持任务代码的变量替换

  5. 支持自定义变量,支持用户在脚本和提交给Linkis的任务参数定义自定义变量,支持简单的+,-等计算
  6. 预设置系统变量:run_date,run_month,run_today等系统变量
  7. 支持date pattern变量,支持pattern的+,-操作

具体技术架构可以参考: Linkis自定义变量

  1. Linkis支持的变量类型分为自定义变量和系统内置变量,内部变量是Linkis预先定义好的,可以直接进行使用。然后不同的变量类型支持不同的计算格式:String支持+、整数小数支持+-\*/,日期支持+-。

目前已支持的内置变量如下: (下表中的变量值举例以闰年的20240229作为特殊日期)

变量名变量类型变量含义变量值举例
run_dateString数据统计时间(支持用户自己设定,默认设置为当前时间的前一天),如今天执行昨天的数据,则为昨天的时间,格式为 yyyyMMdd20240229
run_date_stdString数据统计时间(标准日期格式),如今天执行昨天数据,则为昨天的时间,格式为 yyyy-MM-dd2024-02-29
run_todayStringrun_date (数据统计时间) 的后一天,格式为 yyyyMMdd20240301
run_today_stdStringrun_date (数据统计时间) 的后一天(标准格式),格式为 yyyy-MM-dd2024-03-01
run_monStringrun_date所在月,格式为 yyyyMM202402
run_mon_stdStringrun_date所在月(标准格式),格式为 yyyy-MM2024-02
run_month_beginString数据统计时间所在月的第一天,格式为 yyyyMMdd20240201
run_month_begin_stdStringrun_date 所在月的第一天(标准日期格式),格式为 yyyy-MM-dd2024-02-01
run_month_now_beginStringrun_today所在上月的第一天,格式为 yyyyMMdd20240201
run_month_now_begin_stdStringrun_today所在上月的第一天(标准格式),格式为 yyyy-MM-dd2024-02-01
run_month_endStringrun_date所在月的最后一天,格式为 yyyyMMdd20240229
run_month_end_stdStringrun_date 所在月的最后一天(标准日期格式),格式为 yyyy-MM-dd2024-02-29
run_month_now_endStringrun_today 所在上月的最后一天,格式为 yyyyMMdd20240229
run_month_now_end_stdStringrun_today 所在上月的最后一天(标准日期格式),格式为 yyyy-MM-dd2024-02-29
run_quarter_beginStringrun_date所在季度的第一天,格式为 yyyyMMdd20240101
run_quarter_endStringrun_date 所在季度的最后一天,格式为 yyyyMMdd20240331
run_half_year_beginStringrun_date 所在半年的第一天,格式为 yyyyMMdd20240101
run_half_year_endStringrun_date所在半年的最后一天,格式为 yyyyMMdd20240630
run_year_beginStringrun_date所在年的第一天,格式为 yyyyMMdd20240101
run_year_endStringrun_date所在年的最后一天,格式为 yyyyMMdd20241231
run_quarter_begin_stdStringrun_date所在季度的第一天(标准格式),格式为 yyyy-MM-dd2024-01-01
run_quarter_end_stdStringrun_date所在季度的最后一天(标准格式),格式为 yyyy-MM-dd2024-03-31
run_half_year_begin_stdStringrun_date所在半年的第一天(标准格式),格式为 yyyy-MM-dd2024-01-01
run_half_year_end_stdStringrun_date所在半年的最后一天(标准格式),格式为 yyyy-MM-dd2024-06-30
run_year_begin_stdStringrun_date所在年的第一天(标准格式),格式为 yyyy-MM-dd2024-01-01
run_year_end_stdStringrun_date所在年的最后一天(标准格式),格式为 yyyy-MM-dd2024-12-31
run_tody_hStringrun_today任务运行的时间, yyyyMMddHH2024030111
run_tody_h_stdStringrun_today任务运行的时间 yyyy-MM-dd HH2024-03-01 11

具体细节:

1、run_date为核心自带日期变量,支持用户自定义日期,如果不指定默认为当前系统时间的前一天。 2、其他衍生内置日期变量定义:其他日期内置变量都是相对run_date计算出来的,一旦run_date变化,其他变量值也会自动跟着变化,其他日期变量不支持设置初始值,只能通过修改run_date进行修改。 3、内置变量支持更加丰富的使用场景:${run_date-1}为run_data的前一天;${run_month_begin-1}为run_month_begin的上个月的第一天,这里的-1表示减一个月。

以sql为例的例子:

  1. --@set run_date=20240229
  2. select
  3. "${run_date}" as run_date,
  4. "${run_date_std}" as run_date_std,
  5. "${run_today}" as run_today,
  6. "${run_today_std}" as run_today_std,
  7. "${run_mon}" as run_mon,
  8. "${run_mon_std}" as run_mon_std,
  9. "${run_month_begin}" as run_month_begin,
  10. "${run_month_begin_std}" as run_month_begin_std,
  11. "${run_month_now_begin}" as run_month_now_begin,
  12. "${run_month_now_begin_std}" as run_month_now_begin_std,
  13. "${run_month_end}" as run_month_end,
  14. "${run_month_end_std}" as run_month_end_std,
  15. "${run_month_now_end}" as run_month_now_end,
  16. "${run_month_now_end_std}" as run_month_now_end_std,
  17. "${run_quarter_begin}" as run_quarter_begin,
  18. "${run_quarter_end}" as run_quarter_end,
  19. "${run_half_year_begin}" as run_half_year_begin,
  20. "${run_half_year_end}" as run_half_year_end,
  21. "${run_year_begin}" as run_year_begin,
  22. "${run_year_end}" as run_year_end,
  23. "${run_quarter_begin_std}" as run_quarter_begin_std,
  24. "${run_quarter_end_std}" as run_quarter_end_std,
  25. "${run_half_year_begin_std}" as run_half_year_begin_std,
  26. "${run_half_year_end_std}" as run_half_year_end_std,
  27. "${run_year_begin_std}" as run_year_begin_std,
  28. "${run_year_end_std}" as run_year_end_std,
  29. "${run_today_h}" as run_tody_h,
  30. "${run_today_h_std}" as run_tody_h_std
  31. 编译替换后的内容:
  32. select
  33. "20240229" as run_date,
  34. "2024-02-29" as run_date_std,
  35. "20240301" as run_today,
  36. "2024-03-01" as run_today_std,
  37. "202402" as run_mon,
  38. "2024-02" as run_mon_std,
  39. "20240201" as run_month_begin,
  40. "2024-02-01" as run_month_begin_std,
  41. "20240201" as run_month_now_begin,
  42. "2024-02-01" as run_month_now_begin_std,
  43. "20240229" as run_month_end,
  44. "2024-02-29" as run_month_end_std,
  45. "20240229" as run_month_now_end,
  46. "2024-02-29" as run_month_now_end_std,
  47. "20240101" as run_quarter_begin,
  48. "20240331" as run_quarter_end,
  49. "20240101" as run_half_year_begin,
  50. "20240630" as run_half_year_end,
  51. "20240101" as run_year_begin,
  52. "20241231" as run_year_end,
  53. "2024-01-01" as run_quarter_begin_std,
  54. "2024-03-31" as run_quarter_end_std,
  55. "2024-01-01" as run_half_year_begin_std,
  56. "2024-06-30" as run_half_year_end_std,
  57. "2024-01-01" as run_year_begin_std,
  58. "2024-12-31" as run_year_end_std,
  59. "2024030111" as run_tody_h,
  60. "2024-03-01 11" as run_tody_h_std
  1. 什么是自定义变量?先定义,后使用的用户变量。用户自定义变量暂时支持字符串,整数,浮点数变量的定义,其中字符串支持+法,整数和浮点数支持+-\*/方法。用户自定义变量与SparkSQLHQL本身支持的set变量语法不冲突,但是不允许同名。如何定义和使用自定义变量?如下:
  1. ## 代码中定义,在任务代码前进行指定
  2. sql类型定义方式:
  3. --@set f=20.1
  4. python/Shell类型定义如下:
  5. #@set f=20.1
  6. 注意:只支持一行定义一个变量

使用都是直接在代码中使用通过 {varName表达式},如${f*2}

在linkis中自定义变量也有作用域,优先级为脚本中定义的变量大于在任务参数中定义的Variable大于内置的run_date变量。任务参数中定义如下:

  1. ## restful
  2. {
  3. "executionContent": {"code": "select \"${f-1}\";", "runType": "sql"},
  4. "params": {
  5. "variable": {f: "20.1"},
  6. "configuration": {
  7. "runtime": {
  8. "linkis.openlookeng.url":"http://127.0.0.1:9090"
  9. }
  10. }
  11. },
  12. "source": {"scriptPath": "file:///mnt/bdp/hadoop/1.sql"},
  13. "labels": {
  14. "engineType": "spark-2.4.3",
  15. "userCreator": "hadoop-IDE"
  16. }
  17. }
  18. ## java SDK
  19. JobSubmitAction.builder
  20. .addExecuteCode(code)
  21. .setStartupParams(startupMap)
  22. .setUser(user) //submit user
  23. .addExecuteUser(user) //execute user
  24. .setLabels(labels)
  25. .setVariableMap(varMap) //setVar
  26. .build
  • 支持Pattern格式时间且用户可以自行随意指定
  • Pattern日期变量都是相对run_date计算出来的
  • 支持±y/±M/±d/±H等等
  • 其中+-是先对linkis内置参数run_date进行运算,然后将%之前的pattern字段进行替换,非Pattern字符不支持运算替换。

Pattern格式对照表:

LetterDate or Time ComponentPresentationExamples
GEra designatorTextAD
yYearYear1996; 96
YWeek yearYear2009; 09
MMonth in yearMonthJuly; Jul; 07
wWeek in yearNumber27
WWeek in monthNumber2
DDay in yearNumber189
dDay in monthNumber10
FDay of week in monthNumber2
EDay name in weekTextTuesday; Tue
uDay number of week (1 = Monday, …, 7 = Sunday)Number1
aAm/pm markerTextPM
HHour in day (0-23)Number0
kHour in day (1-24)Number24
KHour in am/pm (0-11)Number0
hHour in am/pm (1-12)Number12
mMinute in hourNumber30
sSecond in minuteNumber55
SMillisecondNumber978
zTime zoneGeneral time zonePacific Standard Time; PST; GMT-08:00
ZTime zoneRFC 822 time zone-0800
XTime zoneISO 8601 time zone-08; -0800; -08:00

可以根据自己的喜好/业务实际情况定义需要动态渲染的参数

variableresult
&{yyyy-01-01}2021-01-01
&{yyyy-01-01%-2y}2019-01-01
&{yyyy-MM-01%-2M}2021-02-01
&{yyyy-MM-dd%-2d}2021-03-31
&{yyyy MM ——- HH%-1H}2021 04 ——- 14
&{yyyyMMdd%-1d}20210401
&{yyyyMM01%-1M}20210301
&{HH%-1H}14
  • 例子1: sql
  1. SELECT * FROM hive.tmp.fund_nav_histories
  2. WHERE dt <= DATE_FORMAT(DATE_ADD('day', -1, DATE(Date_parse('&{yyyyMMdd%-1d}', '%Y%m%d'))), '%Y%m%d')

渲染后

  1. SELECT * FROM hive.tmp.fund_nav_histories
  2. WHERE dt <= DATE_FORMAT(DATE_ADD('day', -1, DATE(Date_parse('20220705', '%Y%m%d'))), '%Y%m%d')
  • 例子2: shell
  1. aws s3 ls s3://***/ads/tmp/dws_member_active_detail_d_20210601_20211231/pt=&{yyyyMMdd%-1d}/

渲染后

  1. aws s3 ls s3://***/ads/tmp/dws_member_active_detail_d_20210601_20211231/pt=20220705/
  • 例子3: datax json
  1. {
  2. "job": {
  3. "setting": {
  4. "speed": {
  5. "channel": 1
  6. }
  7. },
  8. "content": [
  9. {
  10. "reader": {
  11. "name": "s3reader",
  12. "parameter": {
  13. "bucket": "**************",
  14. "path": [
  15. "ads/tmp/ccass_tm_announcements/&{yyyyMMdd%-1d}/"
  16. ],
  17. "stored": "parquet",
  18. "compression": "NONE",
  19. "column": [
  20. {
  21. "index": 0,
  22. "type": "int"
  23. },
  24. {
  25. "index": 1,
  26. "type": "string",
  27. "constant": "&{yyyyMMdd%-1d}"
  28. }
  29. ]
  30. }
  31. },
  32. "writer": {
  33. "name": "streamwriter",
  34. "parameter": {
  35. "print": true
  36. }
  37. }
  38. }
  39. ]
  40. }
  41. }

渲染后

  1. {
  2. "job": {
  3. "setting": {
  4. "speed": {
  5. "channel": 1
  6. }
  7. },
  8. "content": [
  9. {
  10. "reader": {
  11. "name": "s3reader",
  12. "parameter": {
  13. "bucket": "**************",
  14. "path": [
  15. "ads/tmp/ccass_tm_announcements/20220705/"
  16. ],
  17. "stored": "parquet",
  18. "compression": "NONE",
  19. "column": [
  20. {
  21. "index": 0,
  22. "type": "int"
  23. },
  24. {
  25. "index": 1,
  26. "type": "string",
  27. "constant": "20220705"
  28. }
  29. ]
  30. }
  31. },
  32. "writer": {
  33. "name": "streamwriter",
  34. "parameter": {
  35. "print": true
  36. }
  37. }
  38. }
  39. ]
  40. }
  41. }
  • 例子4:python
  1. print(&{yyyyMMdd%-1d})

渲染后

  1. 20220705