通过以下示例为您介绍UDT的执行过程。 --示例数据。
@table1 := select * from values ('100000000000000000000') as t(x);
@table2 := select * from values (100L) as t(y);
--代码逻辑。
--new创建对象。
@a := select new java.math.BigInteger(x) x from @table1;
--静态方法调用。
@b := select java.math.BigInteger.valueOf(y) y from @table2;
--实例方法调用。
select /*+mapjoin(b)*/ x.add(y).toString() from @a a join @b b;
--输出结果如下所示。
100000000000000000100
该UDT共有三个Stage:M1、R2和J3。如果您熟悉MapReduce原理即可知道,由于Join的存在需要做数据Reshuffle,所以会出现多个Stage。通常,不同的Stage是在不同的进程、不同的物理机器上运行的。
M1只执行new java.math.BigInteger(x)操作。
J3在不同阶段执行了java.math.BigInteger.valueOf(y)和x.add(y).toString()操作。这几个操作不仅分阶段执行,而且在不同的进程、不同的物理机器上执行。UDT把这个过程封装起来,将这个过程变得看起来和在同一个JVM中执行的效果几乎一样。
从上述示例中,您可以看到子查询的结果允许UDT类型的列。例如上面变量a的x列是java.math.BigInteger类型,而不是内置类型。UDT类型的数据可以被带到下一个Operator中,再调用其它方法,甚至可以参与数据Shuffle。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。