addax (原datax)之udf函数使用

addax udf函数的使用

  1. 内置函数

    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的结果.
    • likenot 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 数据类型

  2. 自定义函数

    • 如何开发自定义函数?

      原理:通过调用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"
                    ]
                  }
                }
              ]
        
  3. 最佳实现

    • 场景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"
              }
            }
          }
        }
      }
      
      
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值