You need to enable JavaScript to run this app.
导航

DSL 语法

最近更新时间2024.03.20 19:41:21

首次发布时间2022.09.16 09:57:28

DSL 是数据库传输服务 DTS 基于 LISP-1 标准为数据同步场景中数据处理需求设计的脚本语言。DTS 通过 DSL 脚本语言可以对数据中的字符串、日期和数值等进行抽取、转换、加工和加载。

DSL 语法特性

DSL 语法拥有以下特性:

  • 功能强大:支持大量函数组合。

  • 操作高效:DSL 的执行无额外的运行时开销,对同步过程的性能损耗较小。

  • 语法简单:提供了例如数据过滤、数据转换、数据脱敏等典型场景,您可以参考此类场景设置您的专属脚本语言。详细信息,请参见应用场景

数据类型

类型描述示例值
int整型,表示没有小数部分的数值,可以是正数、负数或零。123
float浮点型,表示有小数部分的数值。3.14
string字符串。"abc"
char字符型,表示单个字符。#a
bool布尔型,表示真或假的值。true 或 false
bytes表示以 0B 开头的 16 进制串。0B37
symbol表示无引号包含的字符串。abc
time表示时间类型。(time/parse-beijing "2015-02-23 23:54:55")

表达式类型

类型表达式说明

数组

[参数1 参数2 参数3 ...]

数组以方括号包裹的一串元素。例如:

  • [1 2 3]:表示整型数组。

  • ["a" "b" "c"]:表示字符串数组。

哈希

{key1  value1  key2  value2}

哈希是以花括号包裹的一串元素。奇数位元素为 key,紧随其后的偶数位元素为 value。例如:

{"a" 1 "b" 2 }

表示 key1avalue11key2bvalue22

函数调用

(function-name 参数1 参数2 参数3 ...)

函数调用是括号包括的一串元素。例如:

(+ 1 2)

Quoting

'(参数1 参数2 参数3 ...)

使用单引号 ' 将列表标记为数据,表示一串数据列表,而不是函数调用。例如:

'(1 2 3)

函数定义

(defn 函数名 [参数1 参数2 ...]
  函数体)

使用 defn 定义一个函数。例如定义一个计算平方的函数:

(defn square [x]
  (* x x))

变量绑定

(let [变量1  值1  变量2  值2 ...]
  使用变量的表达式)

使用关键字 let 做变量绑定。例如打印变量 a、b 的值:

(let [a 100 b 200]
   (println a b))

返回 100 200

函数类型

火山引擎支持 DTS 基于 ETL 开发出以下 DSL 脚本语言。

内置函数

  • 表达式函数

    • 数值运算

      功能语法取值范围返回值

      加法

      (+  value1   value2 )
      

      value1 和 value2 的取值范围包含整数或浮点数。

      当参数都为整数时,则返回整数,否则返回浮点数。

      减法

      (-  value1   value2)
      

      value1 和 value2 的取值范围包含整数或浮点数。

      当参数都为整数时,则返回整数,否则返回浮点数。

      乘法

      (*  value1   value2)
      

      value1 和 value2 的取值范围包含整数或浮点数。

      当参数都为整数时,则返回整数,否则返回浮点数。

      除法

      (/  value1   value2)
      

      value1 和 value2 的取值范围包含整数或浮点数。

      当参数都为整数时,则返回整数,否则返回浮点数。

      取模

      (mod  value1   value2)
      

      value1 和 value2 的取值范围包含整数或浮点数。

      当参数都为整数时,则返回整数,否则返回浮点数。

    • 逻辑运算

      • 比较运算

        功能语法取值范围返回值

        大于

        (> value1  value2)
        

        value1 和 value2 的取值范围包含整数、浮点数或字符串。

        truefalse

        小于

        (< value1  value2)
        

        value1 和 value2 的取值范围包含整数、浮点数或字符串。

        truefalse

        等于

        (= value1  value2)
        

        value1 和 value2 的取值范围包含整数、浮点数或字符串。

        truefalse

        大于等于

        (>= value1  value2)
        

        value1 和 value2 的取值范围包含整数、浮点数或字符串。

        truefalse

        小于等于

        (<= value1  value2)
        

        value1 和 value2 的取值范围包含整数、浮点数或字符串。

        truefalse

        不等于

        (!= value1  value2)
        

        value1 和 value2 的取值范围包含整数、浮点数或字符串。

        truefalse

      • 布尔运算

        功能语法取值范围返回值

        OR运算

        (or true false true)
        
        • true

        • false

        truefalse。例如:

        (or (> 1 2) (> 3 2))
        

        返回 true

        AND 运算

        (and true false true)
        
        • true

        • false

        truefalse。例如:

        (and (> 2 1) (> 3 2))
        

        返回 true

        NOT 运算

        (not true)
        
        • true

        • false

        truefalse。例如:

        • 示例一:

          (not (= 1 2))
          

          返会 true

        • 示例二:

          (not (= 1 1))
          

          返回 false

    • 字符串函数

      功能语法返回值

      获取字符串中某个索引位置的字符

      (sget "字符串" 索引位置)
      

      返回索引位置的字符。例如:

      (sget "abcd" 2)
      

      返回 #c

      向字符串追加字符。

      (append "字符串" #追加字符)
      

      返回添加后的字符串。例如:

      (append "ab" #c)
      

      返回 abc

      返回字符串的子串

      (slice 字符串 from to)
      

      返回一个包含从 from 到 to(不包含 to)的子字符串的字符串。例如:

      (slice "abcd" 1 3)
      

      返回 bc

      字符串间的格式转换

      • 将字符串转换为 int 格式

        (int "字符串")
        
      • 将字符串转换为 float 格式

        (float "字符串")
        

      字符串转换成 int 或 float 格式。例如:

      • 返回结果为 123。

        (int "123")
        
      • 返回结果为 3.14。

        (float "3.14")
        
  • 流程控制函数

    功能语法说明

    cond 语句

    (cond
        first-condition first-expression
        second-condition second-expression
        ...
        default-expression)
    

    cond 类似于通用语言中的 Switch 语句,但 cond 必须包含 default 分支。例如:

    (cond (> age 50)  (println "五十而知天命")
          (> age 40)  (println "四十不惑")
          (> age 30)  (println "三十而立")
          (println "年轻人"))
    

    age20 时,则返回年轻人

    if 或 when 语句

    • if 语法表达式:
    (if condition expression)
    
    • when 语法表达式:
    (when condition expression)
    

    if 和 when 的语法表达式具有相同含义,满足条件时则执行某些操作。例如:

    (if (> 2 1) (println "OK"))
    

    返回 ok

    unless语句

    (unless condition expression)
    

    和 if 相反,不满足条件的则执行操作。例如:

    (unless false (println "OK"))
    

    返回 ok

  • 数据操作函数

    • 数组函数

      功能语法返回值

      创建指定长度的数组,或创建指定长度的数组并以指定值初始化

      • 创建指定长度的数组语法表达式:

        (make-array  长度)
        
      • 创建指定长度的数组并以指定值初始化语法表达式:

        (make-array  长度  默认值)
        

      返回指定长度的数组,或指定长度的数组并以指定值初始化。例如:

      • 返回指定长度的数组示例:

        (make-array 3)
        

        返回的数组为 [() () ()]

      • 指定长度的数组并以指定值初始化示例:

        (make-array 3 0)
        

        返回的数组为 [0 0 0]

      按数组索引访问数组

      (aget  数组  索引)
      

      返回索引所在的数组。例如:

      (aget [1  2  3]  1)
      

      返回 2

      设置数组元素值

      (aset!  数组  索引  值)
      

      替换索引位置的值。例如:

      (aset! [0 1 2] 1 3)
      

      返回 [0 3 2]

      判断数组内是否包含某个元素

      (exist?  数组  元素)
      

      返回值为 true 或 false。判断数组内是否包含某个元素。例如:

      (exist? ["a" "b"] "a")
      

      返回 true

      获取数组的子数组

      (slice  数组  from  to)
      

      返回字符串的子数组,返回值为 [from to)。例如:

      (slice [1 2 3 4] 1 3)
      

      返回 [2 3]

    • 哈希函数

      功能语法返回值

      访问 hash 元素

      • 语法一:

        (hget hash key)
        
      • 语法二:

        (hget hash key defalut)
        

      返回访问 hash 元素。例如:

      • 示例一:

        (hget {"a" 2 "b" 3} "a")
        

        返回 2

      • 示例二:

        (hget {"a" 2 "b" 3} "c" 0)
        

        由于访问的元素 key 不存在,则返回自定义的默认值 0

        说明

        默认值 defalut 支持自定义。

      设置 hash 元素

      (def h {"key1" value1})
      (hset! h "key1" 参数1)
      

      返回成功设置后的 hash 元素。例如

      (def h {"a" 3})
      (hset! h "a" 2)
      

      返回 {"a" 2}

      删除 hash 元素

      (def h {"key1" value1 "key2" value2})
      (hdel! h "key")
      

      返回删除后的 hash 元素。例如:

      (def h {"a" 3 "b" 2})
      (hdel! h "a")
      

      返回 {"b" 2}

      探测 hash 是否包含 key

      (exist? {"参数1" "参数2"} "参数1")
      

      返回值如下:

      • true:存在。

      • false:不存在。

      示例如下:

      (exist? {"a" "b"} "a")
      

      返回 true

    • 通用容器函数

      功能语法说明

      在字符串或数组后添加元素

      • 在数组后添加元素

        (append [参数1  参数2]  元素)
        
      • 在字符串后添加元素

        (append  "字符串"   #元素)
        

      返回一个新的数组或字符串。例如:

      • 在数组后添加元素。

        (append [1 2] 3)
        

        返回一个新的数组 [1 2 3]

      • 在字符串后添加元素。

        (append "ab" #c)
        

        返回一个新的字符串 "abc"

      连接多个数组或字符串

      • 连接多个数组

        (concat [参数1 参数2] [参数3 参数4])
        
      • 连接多个字符串

        (concat "字符串 1" "字符串 2")
        

      返回一个新的数组或字符串。例如:

      • 连接多个数组。

        (concat [1 2] [3 4])
        

        返回一个新的数组 [1 2 3 4]

      • 连接多个字符串。

        (concat "ab" "cd")
        

        返回一个新的字符串 "abcd"

    • 字节流函数

      功能语法返回值

      将字节流转换为字符串

      (string 字节流)
      

      返回一个字符串。例如:

      (string 0B68656c6c6f)
      

      返回 hello

      将字符串转换为字节流

      (bytes "字符串")
      

      返回一个字节流。例如:

      (bytes "abc")
      

      返回 0B616263

    • 高阶函数

      功能语法返回值

      将函数应用到列表或数组内每一个元素

      (map 函数 数组)
      

      返回数组中每个元素被应用指定函数的数组或列表。例如:

      • 将函数应用到列表内的每一个元素。

        (map add3 [1 2 3])
        

      返回一个新的数组 [4 5 6]

      • 将函数应用到数组内的每一元素

        (map int ["1" "2" "3"]
        

      返回一个新的数组 [1 2 3]

      使用指定的函数过滤数组

      (filter 函数 数组)
      

      当过滤函数返回 true 时则保留元素,否则将丢弃。例如:

      (defn even? [a] (= 0 (mod a 2)))
      (filter even? [1 2 3 4])
      

      返回结果为 [2 4]

      对数组或列表进行聚合操作

      (foldl 函数 初始值 数组)
      

      返回数组或列表的聚合结果。例如:

      • 对数组进行聚合。

        (foldl + 0 [1 2 3 4])
        

        返回结果为 10

      • 对列表进行聚合。

        (foldl * 1 [1 2 3 4])
        

      返回结果为 24

    • 类型自省

      功能语法返回值
      零值判断zero?当目标参数为 00.0 时,则返回 true,否则返回 false
      NULL 判断null?当目标参数为 () 时,则返回 true,否则返回 false

      空判断

      empty?

      当目标参数为 ()[]""{} 时,则返回 true,否则返回 false

      是否为 Listlist?当目标参数是列表时,则返回 true,否则返回 false
      是否为数组array?当目标参数的数据类型是 array 时,则返回 true,否则返回 false
      是否为数字number?当目标参数的数据类型是 int、char 或 float 时,则返回 true,否则返回 false
      是否为整数int?当目标参数的数据类型是 integer 时,则返回 true,否则返回 false
      是否为浮点数float?当目标参数的数据类型是 float 时,则返回 true,否则返回 false
      是否为字符char?当目标参数的数据类型是 char 时,则返回 true,否则返回 false
      是否为字符串string?当目标参数的数据类型是 string 时,则返回 true,否则返回 false
      是否为符号symbol?当目标参数的数据类型是 symbol 时,则返回 true,否则返回 false
      是否为哈希值hash?当目标参数的数据类型是 hash 时,则返回 true,否则返回 false
      是否为字节流bytes?当目标参数的数据类型是 bytes 时,则返回 true,否则返回 false

      是否返回指定数据类型

      type

      当返回的目标参数的数据类型是 symbol、string、array、bool、char、float、function、hash、int、list 或 bytes 时,则返回 true,否则返回 false

扩展函数

  • 表达式扩展函数

    • 运算扩展函数

      功能语法返回值

      代数左移

      (sla  操作的数据  移动位数)
      

      返回代数左移后的结果。例如:

      (sla 1 3)
      

      返回 8

      代数右移

      (sra  操作的数据  移动位数)
      

      返回代数右移后的结果。例如:

      (sra 1 1)
      

      返回 0

      8bit 逻辑左移

      (sll8  操作的数据  移动位数)
      

      返回 8bit 逻辑左移后的结果。例如:

      • 示例一

        (sll8 1 1)
        

      返回 2

      • 示例二

        (sll8 -1 1)
        

      返回 254

      16bit 逻辑左移

      (sll16  操作的数据  移动位数)
      

      返回 16bit 逻辑左移后的结果。例如:

      • 示例一:

        (sll16 1 1)
        

      返回 2

      • 示例二:

        (sll16 -1 1)
        

      返回 65534

      32bit 逻辑左移

      (sll32  操作的数据  移动位数)
      

      返回 32bit 逻辑左移后的结果。例如:

      • 示例一:

        (sll32 1 1)
        

        返回 2

      • 示例二:

        (sll32 -1 1)
        

        返回 4294967294

      64bit 逻辑左移

      (sll64  操作的数据  移动位数)
      

      返回 64bit 逻辑左移的结果。例如:

      • 示例一

        (sll64 1 1)
        

      返回 2

      • 示例二:

        (sll64 -1 1)
        

      返回 18446744073709551614

      8bit 逻辑右移

      (srl8 操作的数据 移动位数)
      

      返回 8bit 逻辑右移的结果。例如:

      • 示例一:

        (srl8 2 1)
        

        返回 1

      • 示例二:

        (srl8 -2 1)
        

        返回 127

      16bit 逻辑右移

      (srl16  操作的数据  移动位数)
      

      返回 16bit 逻辑右移的结果。

      • 示例一

        (srl16 2 1)
        

        返回 1

      • 示例二:

        (srl16 -2 1)
        

        返回 32767

      32bit 逻辑右移

      (srl32  操作的数据  移动位数)
      

      返回 32bit 逻辑右移的结果。例如:

      • 示例一:

        (srl32 2 1)
        

        返回 1

      • 示例二:

        (srl32 -2 1)
        

        返回 2147483647

      64bit 逻辑右移

      (srl64  操作的数据  移动位数)
      

      返回 64bit 逻辑右移的结果。例如:

      • 示例一:

        (srl64 2 1)
        

        返回 1

      • 示例二:

        (srl64 -2 1)
        

        返回 9223372036854775807

      bit 与

      (bit-and  操作的数据  移动位数)
      

      返回 bit 与的结果。例如:

      (bit-and 3 2)
      

      返回 2

      bit 或

      (bit-or  操作的数据  移动位数)
      

      返回 bit 或的结果。例如:

      (bit-or 3 1)
      

      返回 3

      bit 异或

      (bit-xor  操作的数据  移动位数)
      

      返回 bit 异或的结果。例如:

      (bit-xor 3 1)
      

      返回 2

      bit 取非

      (bit-not  操作的数据  移动位数)
      

      返回 bit 取非的结果。例如:

      (bit-not 2)
      

      返回 -3

    • 时间扩展函数

      功能语法返回值

      返回当前时间

      (time/now)
      

      返回当前时间。例如:

      (time/now)
      

      返回结果为当前的时间点。

      格式化时间

      (time/format  时间  转换目标)
      

      支持将时间转换为 unix 时间戳,单位为秒或毫秒,也支持将时间按指定格式转换为字符串。例如:

      • 将时间转换为 unix 时间戳,单位为秒。

        (time/format (time/now) 'timestamp)
        
      • 将时间转换为 unix 时间戳,单位为毫秒。

        (time/format (time/now) 'timestamp-ms)
        
      • 将时间按指定格式转换为字符串。

        (time/format (time/now) "2006-01-02 15:04:05")
        

      时间解析

      (time/parse 解析目标)
      

      返回时间解析结果。例如:

      • 从 unix 时间戳中解析时间。

        (time/parse 1656988237)
        
      • 使用默认的 layout(2006-01-02 15:04:05),从字符串中解析时间。

        (time/parse "2015-02-23 23:54:55")
        
      • 指定 layout 和时间字符串,从字符串中解析时间。

        (time/parse "2006-Jan-02" "2014-Feb-04")
        
      • 指定 layout、时间字符串和时区,从字符串解析时间。

        (time/parse "2006-Jan-02" "2014-Feb-04" "Asia/Shanghai")
        

      北京时间解析

      time/parse-beijing
      
      (time/parse-beijing "2015-02-23 23:54:55")
      

      时间计算

      (time/add-date 时间  n年 n月 n日)
      

      返回计算后的时间。例如:

      (time/add-date (time/now) 1 2 3)
      

      返回在当前时间的基础上,年份加 1 年、月份加 2 个月、日加 3 天。

      (time/add 时间  n 年或 n 月或 n 日或 n 小时或 n 分钟或 n 秒)
      

      返回计算后的时间。例如:

      • 在当前时间的基础上,年份加 1 年。

        (time/add (time/now) 1 'year)
        
      • 在当前时间的基础上,月份加 1 个月。

        (time/add (time/now) 1 'month)
        
      • 在当前时间的基础上,日加 1 天。

        (time/add (time/now) 1 'day)
        
      • 在当前时间的基础上,小时加 1 小时。

        (time/add (time/now) 1 'hour)
        
      • 在当前时间的基础上,分钟增加 1 分钟。

        (time/add (time/now) 1 'minute)
        
      • 在当前时间的基础上,秒增加 1 秒。

        (time/add (time/now) 1 'second)
        
      (time/sub  time1   time2)
      

      返回 time1 和 time2 的时间差值,单位为秒。

      返回年份

      (time/year   时间)
      

      返回时间的年份。例如:

      (time/year (time/now))
      

      返回当前时间的年份。

      返回月份

      (time/mouth  时间)
      

      返回时间的月份。例如:

      (time/mouth  (time/now))
      

      返回当前时间的月份。

      返回日

      (time/day  时间)
      

      返回时间的日。例如:

      (time/day (time/now))
      

      返回当前时间的日。

      返回小时

      (time/hour  时间)
      

      返回时间的小时。例如:

      (time/hour (time/now))
      

      返回当前时间的小时。

      返回分钟

      (time/minute  时间)
      

      返回时间的分钟。例如:

      (time/minute (time/now))
      

      返回当前时间的分钟。

      返回秒数

      (time/second  时间)
      

      返回时间的秒数。例如:

      (time/second (time/now))
      

      返回当前时间的秒数。

      返回星期数

      (time/weekday  时间)
      

      返回时间的星期数。例如:

      (time/weekday (time/now))
      

      返回当前时间的星期数。

    • 字符串扩展函数

      功能语法返回值

      验证是否包含字符串

      (str/contains? "字符串" "字符")
      

      返回值如下:

      • true:表示该字符存在于字符串内。

      • false:表示该字符不存在于字符串内。

      例如:

      (str/contains? "abc" "b")
      

      返回 true

      查询子字符串的数量

      (str/count "字符串" "子字符串")
      

      返回在字符串内包含多少个子字符串。例如:

      (str/count "abcc" "c")
      

      返回 2

      验证字符串是否以某个子串为前缀

      (str/start-with? "字符串" "字符")
      

      返回值如下:

      • true:表示以该字符为前缀。

      • false:表示不以该字符为前缀。

      例如:

      (str/start-with? "abc" "a")
      

      返回 true

      验证字符串是否以某个子串为后缀

      (str/end-with?  "字符串"  "字符")
      

      返回值如下:

      • true:表示以该字符为后缀。

      • false:表示不以该字符为后缀。

      例如:

      (str/end-with? "abc" "c")
      

      返回 true

      返回某个目标字符在字符内第一次出现时的下标

      (str/index  "字符串"  "目标字符")
      

      返回该字符在字符串的下标。例如:

      (str/index "abc" "b")
      

      返回 1

      验证字符串是否都是字母

      (str/alpha?  "字符串")
      

      返回值如下:

      • true:表示字符串内都是字母。

      • false:表示字符串内不全是字母。

      例如:

      (str/alpha? "ab1")
      

      返回 false

      验证字符串是否都是数字

      (str/digit? "字符串")
      

      返回值如下:

      • true:表示字符串内都是数字。

      • false:表示字符串内不全是数字。

      例如:

      (str/digit? "ab1")
      

      返回 false

      拼接字符串

      (str/join ["字符串1" "字符串2"] "拼接符")
      

      返回字符串的拼接结果,支持任意拼接符拼接字符串。例如:

      (str/join ["a" "b"] "_")
      

      返回 "a_b"

      将字符串内的大写字母转换为小写字母

      (str/lower "字符串")
      

      返回转换为小写字母的字符串。例如:

      (str/lower "ABC")
      

      返回 "abc"

      将字符串内的小写字母转换为大写字母

      (str/upper "字符串")
      

      返回转换为大写字母的字符串。例如:

      (str/upper "abc")
      

      返回 "ABC"

      替换字符串内的子串

      (str/replace "字符串" "字符串的子串" "目标子串")
      

      返回替换后的字符串。例如:

      (str/replace "abc" "b" "B")
      

      返回 "aBc"

      分割字符串

      (str/split "字符串1 拼接符 字符串2" "拼接符")
      

      返回分割后的数组,需指定字符串间的拼接符分割字符串,字符串支持任意拼接符拼接。例如:

      (str/split "a_b" "_")
      

      返回 ["a" "b"]

      将字符串的首字母转换为大写字母

      (str/title "字符串")
      

      返回转换后的字符串。例如:

      (str/title "abc")
      

      返回 "Abc"

      验证字符串的首字母是否为大写字母

      (str/title?  "字符串")
      

      返回值如下:

      • true:表示字符串的首字母是大写字母。

      • false:表示字符串的首字母不是大写字母。

      例如:

      (str/title? "abc")
      

      返回 false

      删除字符串前缀

      (str/trim-prefix "字符串" "前缀")
      

      返回删除了前缀的字符串。例如:

      (str/trim-prefix "_abc" "_")
      

      返回 "abc"

      删除字符串后缀

      (str/trim-suffix "字符串" "后缀")
      

      返回删除了后缀的字符串。例如:

      (str/trim-suffix "abc_" "_")
      

      返回 "abc"

      删除字符串的前后空格

      (str/trim-space " 字符串 ")
      

      返回删除了前后空格后的字符串。例如:

      (str/trim-space " abc ")
      

      返回 "abc"

      计算字符串的 MD5 值

      (str/md5 "字符串")
      

      返回字符串的 MD5 值。例如;

      (str/md5 "abc")
      

      返回 "900150983cd24fb0d6963f7d28e17f72"

      脱敏字符串的敏感信息

      (str/mask  "字符串"  开始索引  结束索引  "*")
      

      返回脱敏后的字符串,支持任意字符进行脱敏。例如;

      • 示例一

        (str/mask "hello" 1 2 "*")
        

        返回 "h**lo"

      • 示例二

        (str/mask "hello" 1 -1 "*")
        

        1 -1 表示从开始索引到结束索引将全部遮盖。则本示例返回 "h****"

  • 数据操作扩展函数

    • 内核扩展函数

      功能语法返回值

      设置函数别名

      (alias 别名 原名)
      

      为原函数设置别名。例如:
      本示例表示为加法运算设置别名 plus

      (alias plus +)
      

      当使用加法运算时,您可以通过以下语法进行加法运算:

      (plus 1  2)
      

      返回 3

      打印函数

      • 语法一:

        (println  参数)
        
      • 语法二:

        (printf  "格式化串" 参数1 参数2...)
        
      • 语法三:

        (print  参数)
        

      输出函数。例如:

      • 语法一示例:

        (println "hello world")
        

        输出"hello world"

      • 语法二示例:

        (printf "Hi, %v" "Jack")
        

        说明

        默认使用 %v 当作占位符

        输出 "Hi, Jack"

    • JSON 扩展函数

      功能语法返回值

      将 JSON 对象转换为字符串

      (json/stringify  {"key1"  value1  "key2" value2  "key3"  value3})
      

      返回成功转换后的字符串。例如:

      (json/stringify {"a" 1 "b" '() "c" true})
      

      返回 {"a":1,"b":null,"c":true}

      将字符串转换为 JSON 对象

      (json/parse   "{"key1" : value1,  "key2" : value2,  "key3" : value3}")
      

      返回成功转换后的 JSON 对象。例如:

      (json/parse "{"a":1,"b":null,"c":true}")
      

      返回 {"a" 1 "b" () "c" true}

      DTS ETL 和 JSON 之间的映射规则如下表所示:

      DTS ETL 语法构件JSON
      integerinteger
      floatfloat
      stringstring
      symbolstring
      ()null
      arrayarray
      bytesbase64 encoded string
      listarray
      hashobject
      boolbool
      charInteger value of char
    • Base64 扩展

      功能语法返回值

      将 Base64 编码的字符串转换为字节流

      (base64/decode "Base64")
      

      返回转换成功的字节流。例如:

      (base64/decode "aGVsbG8=")
      

      返回 "0B68656c6c6f"

      将字节流转换为 Base64 编码

      (base64/encode 字节流)
      

      返回转换成功的 Base64。例如:

      (base64/encode 0B68656c6c6f)
      

      返回 "aGVsbG8="

领域函数

功能语法返回值

删除当前记录

(dts/drop)

删除当前数据行,无返回结果。

查询当前记录是否已被丢弃

(dts/dropped?)

返回类型为 bool。

返回当前记录的数据库的名称

(dts/db)

返回类型为 string。

返回当前记录的表格的名称

(dts/table)

返回类型为 string。

返回当前记录的事件类型

(dts/event)

返回类型为 string。支持以下事件类型:

  • BEGIN

  • COMMIT

  • DDL

  • DML

返回当前记录的 DML 类型

(dts/dml)

返回类型为 string。支持以下 DML 类型:

  • INSERT:增加。

  • UPDATE:更新。

  • DELETE:删除。

设置 Tag

(dts/set-tag)

无返回类型。

查询记录的某列是否为 null

(dts/column-null? COLUMN)

返回类型为 bool。

查询记录的某列是否存在

(dts/column-exist? COLUMN)

返回类型为 bool。

验证当前事件是否是 DDL 事件

(dts/ddl?)

返回类型为 bool。

验证当前事件是否是 DML 事件

(dts/dml?)

返回类型为 bool。

验证当前事件是否是 DML UPDATE

(dts/update?)

返回类型为 bool。

验证当前事件是否是 DML DELETE

(dts/delete?)

返回类型为 bool。

验证当前事件是否是 DML INSERT

(dts/insert?)

返回类型为 bool。

返回记录的某个字段值

(dts/column COLUMN DEFAULT)

返回的字段类型支持 string、int、bool 或 float 等。

说明

当该列不存在或为空时,则给定默认值 DEFAULT。

返回当前记录所有字段名

(dts/columns)

返回类型为字符串数组。

设置字段值

(dts/set-column COLUMN VALUE)

无返回类型。

使用指定函数对某列值做变换

(dts/map-column COLUMN FUNCTION)

无返回类型。

过滤某列

dts/drop-column COLUMN)

无返回类型。

(语法糖)对某个表执行某些操作

(dts/match-table TABLE EXPRESSIONS)

无返回类型。

(语法糖)如果是对表的 INSERT 操作则执行某些操作

(dts/match-insert-on-table TABLE EXPRESSIONS)

无返回类型。

(语法糖)如果是对表的 UPDATE 操作则执行某些操作

(dts/match-update-on-table TABLE EXPRESSIONS)

无返回类型。

(语法糖)如果是对表的 DELETE 操作则执行某些操作

(dts/match-delete-on-table TABLE EXPRESSIONS)

无返回类型。

(语法糖)如果是 DML 事件执行某些操作

(dts/match-dml-on-table TABLE EXPRESSIONS)

无返回类型。

(语法糖)正则匹配某个表(不带库名匹配)并执行某些操作

(dts/match-table-regexp TABLE EXPRESSIONS)

无返回类型。

(语法糖)正则匹配某个表(带库名匹配)并执行某些操作

(dts/match-db-table-regexp DBTABLE EXPRESIONS)

无返回类型。

MySQL 字段类型

MySQL 的字段类型在 DSL 语法中对应的类型如下表所示。

MySQL 字段类型示例DSL 字段类型示例

bit

b'111'

bytes

0B07

tinyint

3

int

3

bool

true

bool

true

smallint

3

int

3

mediumint

3

int

3

int

3

int

3

integer

3

int

3

bigint

3

int

3

bigint unsigned

18446744073709551615

int

18446744073709551615

decimal

333.333

float

333.333

dec

333.333

float

333.333

float

1.1

float

1.1

double

1.1

float

1.1

date

'2001-01-01'

string

"2001-01-01"

datetime

'2001-01-01 01:01:01'

string

"2001-01-01 01:01:01"

timestamp

'2001-01-01 01:01:01'

time

"2001-01-01 01:01:01"

time

'01:01:01'

string

"01:01:01"

year

2001

int

2001

char

'abc'

string

"abc"

varchar

'abc'

string

"abc"

binary

'abc'

bytes

0B616263

varbinary

'abc'

bytes

0B616263

tinyblob

'abc'

bytes

0B616263

tinytext

'abc'

string

"abc"

blob

'abc'

bytes

0B616263

text

'abc'

string

"abc"

mediumblob

'abc'

bytes

0B616263

mediumtext

'abc'

string

"abc"

longblob

'abc'

bytes

0B616263

longtext

'abc'

string

"abc"

enum

'a'

int

1

set

'a,b'

int

3

geometry

GeomFromText('POINT(1 1)')

bytes

0B000000000101000000000000000000f03f000000000000f03f

point

GeomFromText('POINT(1 1)')

bytes

0B000000000101000000000000000000f03f000000000000f03f

linestring

GeomFromText('LINESTRING(0 0,1 1,2 2)')

bytes

0B000000000101000000000000000000f03f000000000000f03f

polygon

GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))')

bytes

0B000000000101000000000000000000f03f000000000000f03f

multipoint

GeomFromText('MULTIPOINT(1 1,2 2)')

bytes

0B000000000101000000000000000000f03f000000000000f03f

multilinestring

GeomFromText('MULTILINESTRING((0 0,1 1,2 2),(0 0,2 2,4 4))')

bytes

0B000000000101000000000000000000f03f000000000000f03f

multipolygon

GeomFromText(‘MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))’)

bytes

0B000000000101000000000000000000f03f000000000000f03f

geometrycollection

GeomFromText('GEOMETRYCOLLECTION(POINT(2 1),LINESTRING(0 0,1 1,2 2,3 3,4 5))')

bytes

0B000000000101000000000000000000f03f000000000000f03f

json

'{"key":"value"}'

string

"{\"key\": \"value\"}"

相关文档