Spark SQL Catalyst源码分析之UDF

本文深入探讨Spark SQL中User Defined Function(UDF)的注册和计算过程,从SqlParser解析UnresolvedFunction到Analyzer阶段的UDF元数据注册,再到实际的UDF计算。Spark 1.1引入的新特性使得UDF支持更加强大,UDFRegistration提供了便捷的注册方式,支持最多22个参数的Scala函数。UDF在计算时,通过ScalaUdf将scala function转化为Catalyst Expression,利用反射调用function完成计算。
摘要由CSDN通过智能技术生成

 /** Spark SQL源码分析系列文章*/ 

在SQL的世界里,除了官方提供的常用的处理函数之外,一般都会提供可扩展的对外自定义函数接口,这已经成为一种事实的标准。

  在前面Spark SQL源码分析之核心流程一文中,已经介绍了Spark SQL Catalyst Analyzer的作用,其中包含了ResolveFunctions这个解析函数的功能。但是随着Spark1.1版本的发布,Spark SQL的代码有很多新完善和新功能了,和我先前基于1.0的源码分析多少有些不同,比如支持UDF:

  spark1.0及以前的实现:

  protected[sql] lazy val catalog: Catalog = new SimpleCatalog
  @transient
  protected[sql] lazy val analyzer: Analyzer =
    new Analyzer(catalog, EmptyFunctionRegistry, caseSensitive = true) //EmptyFunctionRegistry空实现
  @transient
  protected[sql] val optimizer = Optimizer

  Spark1.1及以后的实现:

  protected[sql] lazy val functionRegistry: FunctionRegistry = new SimpleFunctionRegistry //SimpleFunctionRegistry实现,支持简单的UDF

  @transient
  protected[sql] lazy val analyzer: Analyzer =
    new Analyzer(catalog, functionRegistry, caseSensitive = true)

一、引子:

  对于SQL语句中的函数,会经过SqlParser的的解析成UnresolvedFunction。UnresolvedFunction最后会被Analyzer解析。

 SqlParser:

 除了非官方定义的函数外,还可以定义自定义函数,sql parser会进行解析。

  ident ~ "(" ~ repsep(expression, ",") <~ ")" ^^ {
      case udfName ~ _ ~ exprs => UnresolvedFunction(udfName, exprs)
  将SqlParser传入的udfName和exprs封装成一个class class UnresolvedFunction继承自Expression。

  只是这个Expression的dataType等一系列属性和eval计算方法均无法访问,强制访问会抛出异常,因为它没有被Resolved,只是一个载体。

case class Unr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值