理论上,每种数据类型应该对应一个控制文件,意味着控制文件来描述该种数据类型如何解析和转换 。
- Key 主要标注该控制文件处理的类型ID;
- Delimiter 为文件列切割字符;
- Fields 中包含每列的字段描述;
- 数据类型支持Java基本类型和date类型;
- Skip为数据对齐语法,控制在列中忽略某列的值;
- Default = true 属性为数据对齐语法,给某列提供默认值,提供默认值的列在数据列中不移动位移;
- Value 提供了给该字段提供当列中无值时提供默认值;value=https://www.isolves.com/it/cxkf/bk/2020-07-14/null则指定列值为null;
- Date 类型需 pattern 属性;
文章插图
默认值
词法分析时字段field 的value 属性值没有以英文小括号闭合的实体 。如下示例中的primeton:
<field type="string" default="true" value=https://www.isolves.com/it/cxkf/bk/2020-07-14/"primeton">data_vendor函数
函数是由一组字符串、数字、下划线组成的合法函数名和0 到多个形式参数组成 。在词法分析时字段field 的 value 属性值由英文小括号闭合的实体 。如下示例中的:
location(),yn(),concat();<field type="string" default="true" value=https://www.isolves.com/it/cxkf/bk/2020-07-14/" unix_timestamp ">curr_time
函数体小括号前面的部分 。一般由字符串、数字、下划线组成的一组特定的名称 。如location(receiver_tel),location 即为该函数的函数名称 。
函数的形式参数:
1.无参数
词法分析时value的值满足函数条件且函数体内无参数 。如下示例中:unix_timestamp() 获得当前系统内的 Unix 时间戳;
<field type="string" default="true" value=https://www.isolves.com/it/cxkf/bk/2020-07-14/" unix_timestamp()">curr_time【基于XML描述的可编程函数式ETL实现】2.常量型形参
词法分析时函数体内以英文单引号引用的值为函数体的常量型形参 。如’100’,函数示例为:random_int(‘100’),生成 0-100 以内的随机整形数值;
<field type="string" default="true" value=https://www.isolves.com/it/cxkf/bk/2020-07-14/"random_int(‘100’)">rand_num3.变量型形参
词法分析时函数体内参数没有英文单引号引用并且不以英文小括号闭合的为函数体的变量型形参 。如下示例中的receiver_tel;
<field type="string" default="true" value=https://www.isolves.com/it/cxkf/bk/2020-07-14/"location(receiver_tel)">r_num_loc4.函数型形参
词法分析时函数体内没有英文单引号并且以英文小括号闭合的参数类型参数为函数体的函数型参数 。如下示例中的:none(sender_num)和none(receiver_num);
<field type="string" default="true" value=https://www.isolves.com/it/cxkf/bk/2020-07-14/"yn(all_true(none(sender_num), none(receiver_num)))">all_num_null词法分析获得到函数体的同时,使用函数名调用UdfRegistors.getUdf(udfName) 函数,以检验当前系统必要存在该函数,否则则抛出无法识别的函数异常 。
5.类型校验
词法分析阶段获得了字段 field 的取值是默认值或者函数,下一步需校验其默认值或函数的返回值是否能和定义的字段类型相匹配 。如果是函数同时校验函数的形参和实参类型是否相匹配 。
<field type="string" default="true" value=https://www.isolves.com/it/cxkf/bk/2020-07-14/"primeton">data_vendor
四、UDF 函数编写方法编写一个UDF函数的步骤:
- 继承 UDF 类,实现 eval 方法;
- Eval 方法传入的是一个数组参数;
- 判断参数长度是否和预期的一致;
- 判断位置参数类型是否和预期的一致;
- 实现函数体;
- 返回eval函数执行的返回值,理论上该返回值的类型应该一致,不应该同一函数返回多种类型值;
推荐阅读
- 常见分布式锁实现方式
- 手机店铺介绍怎么写 淘宝开店宝贝描述怎么写
- 基于CentOS8Linux运维教程-Linux系统用户与组管理
- 淘宝店铺描述写什么 淘宝开店描述下你的店铺这怎么写
- 螃蟹女为什么不能娶?
- 推荐一款适合程序员使用的前端框架ZUI,基于Bootstrap深度定制款
- 基于云落地SLB+Tengine实现高可用集群负载均衡 - 中
- 基于CentOS7编译安装mono环境运行C#程序
- 0785-基于CDP7.1.1的Spark3.0技术预览版本发布
- tcp,icmp,http 基于wireshark报文分析快速过滤报文时延