加入收藏 | 设为首页 | 会员中心 | 我要投稿 好传媒网 (https://www.haochuanmei.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

Apache Flink 漫谈系列(10) - JOIN LATERAL

发布时间:2018-12-17 03:43:09 所属栏目:教程 来源:孙金城
导读:一、聊什么 上一篇《Apache Flink 漫谈系列 - JOIN算子》我们对最常见的JOIN做了详尽的分析,本篇介绍一个特殊的JOIN,那就是JOIN LATERAL。JOIN LATERAL为什么特殊呢,直观说因为JOIN的右边不是一个实际的物理表,而是一个VIEW或者Table-valued Funciton

Apache Flink 利用 Calcite进行SQL的解析和优化,目前Calcite完全支持LATERAL语法,示例如下:

  1. SELECT 
  2. e.NAME, e.DEPTNO, d.NAME 
  3. FROM EMPS e, LATERAL ( 
  4. SELECT 
  5. FORM DEPTS d 
  6. WHERE e.DEPTNO=d.DEPTNO 
  7. ) as d; 

查询结果:

Apache Flink 漫谈系列(10) - JOIN LATERAL

我使用的是Calcite官方自带测试数据。

2. Flink

截止到Flink-1.6.2,Apache Flink 中有两种场景使用LATERAL,如下:

  • UDTF(TVF) - User-defined Table Funciton
  • Temporal Table - 涉及内容会在后续篇章单独介绍。

本篇我们以在TVF(UDTF)为例说明 Apache Fink中如何支持LATERAL。

(1) UDTF

UDTF- User-defined Table Function是Apache Flink中三大用户自定义函数(UDF,UDTF,UDAGG)之一。 自定义接口如下:

  • 基类
  1. /** 
  2. * Base class for all user-defined functions such as scalar functions, table functions, 
  3. * or aggregation functions. 
  4. */ 
  5. abstract class UserDefinedFunction extends Serializable { 
  6. // 关键是FunctionContext中提供了若干高级属性(在UDX篇会详细介绍) 
  7. def open(context: FunctionContext): Unit = {} 
  8. def close(): Unit = {} 
  • TableFunction
  1. /** 
  2. * Base class for a user-defined table function (UDTF). A user-defined table functions works on 
  3. * zero, one, or multiple scalar values as input and returns multiple rows as output. 
  4. * The behavior of a [[TableFunction]] can be defined by implementing a custom evaluation 
  5. * method. An evaluation method must be declared publicly, not static and named "eval". 
  6. * Evaluation methods can also be overloaded by implementing multiple methods named "eval". 
  7. * User-defined functions must have a default constructor and must be instantiable during runtime. 
  8. * By default the result type of an evaluation method is determined by Flink's type extraction 
  9. * facilities. This is sufficient for basic types or simple POJOs but might be wrong for more 
  10. * complex, custom, or composite types. In these cases [[TypeInformation]] of the result type 
  11. * can be manually defined by overriding [[getResultType()]]. 
  12. */ 
  13. abstract class TableFunction[T] extends UserDefinedFunction { 
  14.  
  15. // 对于泛型T,如果是基础类型那么Flink框架可以自动识别, 
  16. // 对于用户自定义的复杂对象,需要用户overwrite这个实现。 
  17. def getResultType: TypeInformation[T] = null 

(编辑:好传媒网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读