spark-sql-catalyst

Spark SQL Catalyst模块主要负责SQL解析和优化工作,包括parse(语法解析)、resolve(引用验证与结合)以及生成和优化logical plan。文章提及了Decimal类型的优化、Metadata注意事项以及TreeNode在表达式和计划树中的应用。此外,还介绍了Expression、DSL、SqlParser和不同JoinType在QueryPlan中的角色。
摘要由CSDN通过智能技术生成

spark-sql-catalyst

@(spark)[sql][catalyst]
简单说这部分就是做optimizer的工作的,关于这部分是有一篇论文,写的很清楚,可以当作high leve design来看。

还有一篇blog,内容差不多。

总的来说,在catalyst这部分做的事情基本上是传统关系数据库的:
1. parse(让sql语句变成合法的语法树)
2. resolve(验证olumn,table之类的确实存在,并把table,column的scheme和具体的名字结合起来。
3. 生成具体logicplan,详细的见talyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/basicOperators.scala,典型的比如filter,project,sort,union等等。
4. 这里是一个基于规则的优化器,具体代码在catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala
1. 按道理来说,catalyst和Spark没有必然的联系,可以看作一个SQL的optimizer。

types

原生类型

值得一提的是

/**                                                                                                                                                                     
 * ::DeveloperApi::                                                                                                                                                     
 * The data type for User Defined Types (UDTs).                                                                                                                         
 *                                                                                                                                                                      
 * This interface allows a user to make their own classes more interoperable with SparkSQL;                                                                             
 * e.g., by creating a [[UserDefinedType]] for a class X, it becomes possible to create                                                                                 
 * a `DataFrame` which has class X in the schema.                                                                                                                       
 *                                                                                                                                                                      
 * For SparkSQL to recognize UDTs, the UDT must be annotated with                                                                                                       
 * [[SQLUserDefinedType]].                                                                                                                                              
 *                                                                                                                                                                      
 * The conversion via `serialize` occurs when instantiating a `DataFrame` from another RDD.                                                                             
 * The conversion via `deserialize` occurs when reading from a `DataFrame`.                                                                                             
 */                                                                                                                                                                     
@DeveloperApi                                                                                                                                                           
abstract class UserDefinedType[UserType] extends DataType with Serializable {
             

让我们来看一个例子:

class PointUDT extends UserDefinedType[Point] {
   
    def dataType = StructType(Seq( // Our native structure
        StructField("x", DoubleType),
        StructField("y", DoubleType)
    ))
    def serialize(p: Point) = Row(p.x, p.y)
    def deserialize(r: Row) =
    Point(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值