addax udf函数的使用
-
内置函数
dx_substr¶
dx_substr(idx, pos, length) -> str
参数
idx
: 字段编号,对应record中第几个字段pos
: 字段值的开始位置length
: 目标字段长度
返回: 从字符串的指定位置(包含)截取指定长度的字符串。如果开始位置非法抛出异常。如果字段为空值,直接返回(即不参与本transformer)
dx_pad¶
dx_pad(idx, flag, length, chr)
参数
idx
: 字段编号,对应record中第几个字段flag
: “l”,“r”, 指示是在头进行填充,还是尾进行填充length
: 目标字段长度chr
: 需要填充的字符
返回: 如果源字符串长度小于目标字段长度,按照位置添加pad字符后返回。如果长于,直接截断(都截右边)。如果字段为空值,转换为空字符串进行pad,即最后的字符串全是需要pad的字符
举例:
dx_pad(1,"l","4","A")
: 如果column 1
的值为xyz=> Axyz
, 则转换后的值为xyzzzzz => xyzz
dx_pad(1,"r","4","A")
, 如果column 1
的值为xyz=> xyzA
, 值为xyzzzzz => xyzz
dx_replace¶
dx_replace(idx, pos, length, str) -> str
参数
idx
: 字段编号,对应record中第几个字段pos
: 字段值的开始位置length
: 需要替换的字段长度str
: 要替换的字符串
返回: 从字符串的指定位置(包含)替换指定长度的字符串。如果开始位置非法抛出异常。如果字段为空值,直接返回(即不参与本transformer)
举例:
dx_replace(1,"2","4","****")
: 如果column 1
的值为addaxTest
, 则转换为da****est
dx_replace(1,"5","10","****")
如果column 1
的值为addaxTest
则转换为data****
dx_filter¶
dx_filter(idx, operator, expr) -> str
参数:
idx
: 字段编号,对应record中第几个字段operator
: 运算符, 支持like
,not like
,>
,=
,<
,>=
,!=
,<=
expr
: 正则表达式(java正则表达式)、值str
: 要替换的字符串
返回:
- 如果匹配正则表达式,返回Null,表示过滤该行。不匹配表达式时,表示保留该行。(注意是该行)。对于
>
,=
,<
都是对字段直接compare的结果. like
,not like
是将字段转换成字符类型,然后和目标正则表达式进行全匹配。>
,=
,<
,>=
,!=
,<=
,按照类型进行比较, 数值类型按大小比较,字符及布尔类型按照字典序比较- 如果目标字段为空(null),对于
= null
的过滤条件,将满足条件,被过滤。!=null
的过滤条件,null不满足过滤条件,不被过滤。like
,字段为null不满足条件,不被过滤,和not like
,字段为null满足条件,被过滤。
举例
dx_filter(1,"like","dataTest")
dx_filter(1,">=","10")
关联filter暂不支持,即多个字段的联合判断,函参太过复杂,用户难以使用。
dx_groovy¶
dx_groovy(code, package) -> record
参数
code
: 符合 groovy 编码要求的代码package
: extraPackage, 列表或者为空
返回
Record 数据类型
-
自定义函数
-
如何开发自定义函数?
原理:通过调用dx_groovy内置函数,传入对应的参数(code:符合groovy语法的逻辑处理代码),启动程序,则会执行code对应的逻辑代码,进行数据处理。
来个例子:
{ -- 函数名称,自定义函数均使用该函数 "name": "dx_groovy", "parameter": { --表示处理的第二列数据 "columnIndex": 1, -- groovy 逻辑代码,实现substring功能 "code": "Column column = record.getColumn(1);\n"+ " String oriValue = column.asString();\n"+ " String newValue = oriValue.substring(0, 3);\n"+ " record.setColumn(1, new StringColumn(newValue));\n"+ " return record;", -- 导入的应用包,为数组 "extraPackage":[""] } },
-
如何使用自定义函数?
-
配置:transformer数据转换参数,与reader和writer 类似
来个例子:
-- 转换操作:1.使用自定义函数截取原列的前3位字符;2.使用内置函数dx_substr截取第二列前四位字符 "transformer": [ { "name": "dx_groovy", "parameter": { "columnIndex": 1, "code": "Column column = record.getColumn(1);String oriValue = column.asString();String newValue = oriValue.substring(0, 3);record.setColumn(3, new StringColumn(newValue));return record;", "extraPackage":[""] } }, { "name": "dx_substr", "parameter": { "columnIndex": 1, "paras": [ "0", "4" ] } } ]
-
-
-
最佳实现
-
场景1:对原字段进行处理转换的到新的数据。
-
场景2:增加新列
- 通过原有列进行转化生成新列
- 常量作为新列
{ "job": { "setting": { "speed": { "channel": 3 }, "errorLimit": { "record": 0, "percentage": 0.02 } }, "content": { "reader": { "name": "kudureader", "parameter": { "masterAddress": "xxxx:7051,xxxx:7051,xxxx:7051", "table": "impala::temp.datax_kudu_test2", "splitPk": "userid", "lowerBound": 1, "upperBound": 1000, "readTimeout": 5, "scanTimeout": 10, "column": ["userid","username","time"], "where": "userid <= 1000000" } }, "transformer": [ { "name": "dx_groovy", "parameter": { "columnIndex": 1, "code": "Column column = record.getColumn(1);String oriValue = column.asString();String newValue = oriValue.substring(0, 3);record.setColumn(3, new StringColumn(newValue));return record;", "extraPackage":[""] } }, { "name": "dx_substr", "parameter": { "columnIndex": 1, "paras": [ "0", "4" ] } } ], "writer": { "name": "kuduwriter", "parameter": { "masterAddress": "xxxxx:7051,xxxx:7051,xxxx:7051", "timeout": 60, "table": "impala::temp.datax_kudu_test3", "writeMode": "upsert", "column": [ "userid","username", "time","message"], "batchSize": 1024, "bufferSize": 2048, "skipFail": true, "encoding": "UTF-8" } } } } }
-