Spark SQL Catalyst源码分析之UDF

本文详细分析了Spark SQL中的用户自定义函数(UDF)注册和计算过程。在Spark SQL中,UDF首先通过SqlParser解析成UnresolvedFunction,然后在Analyzer阶段使用FunctionRegistry进行注册。UDFRegistration提供了registerFunction方法用于注册UDF,将Scala函数转化为Catalyst的Expression。在计算时,UDF作为Expression节点,通过反射调用scala函数进行实际计算。Spark的UDF实现简单,利用Scala函数的灵活性,提高了UDF的易用性和可读性。
摘要由CSDN通过智能技术生成

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

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

  spark1.0及以前的实现:

 

 
  1. protected[sql] lazy val catalog: Catalog = new SimpleCatalog

  2. @transient

  3. protected[sql] lazy val analyzer: Analyzer =

  4. new Analyzer(catalog, EmptyFunctionRegistry, caseSensitive = true) //EmptyFunctionRegistry空实现

  5. @transient

  6. protected[sql] val optimizer = Optimizer

 

  Spark1.1及以后的实现:

 

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

  2.  
  3. @transient

  4. protected[sql] lazy val analyzer: Analyzer =

  5. new Analyzer(catalog, functionRegistry, caseSensitive = true)

 

一、引子:

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

 SqlParser:

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

 
  1. ident ~ "(" ~ repsep(expression, ",") <~ ")" ^^ {

  2. case udfName ~ _ ~ exprs => UnresolvedFunction(udfName, exprs)

  将SqlParser传入的udfName和exprs封装成一个class class UnresolvedFunction继承自Expression。

 

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

 
  1. case class Unresolved

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值