UDT的实现原理是什么?

UDT的实现原理是什么?

请先 登录 后评论

1 个回答

江帅帅 | 奈学教育 - 架构师
擅长:Java,Python

通过以下示例为您介绍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

attachments-2020-08-ldR2P6AO5f3e5111e685f.png

该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。

请先 登录 后评论
  • 1 关注
  • 0 收藏,118 浏览
  • NX小编 提出于 2020-07-28 14:06