2019独角兽企业重金招聘Python工程师标准>>>

解析sql的库。

主要类

名称

说明

CodeGenerate

代码生成器,主要对Expression生成对应的java代码,输出ExprCode。里面包含了一系列的ExprCode子类。

ExprCode

生成java代码,和Expression对应。Expression还有eval方法在InternalRow上判断条件表达式是否满足。

Expression

条件表达式,主要的方法是eval和genCode,后者生成对应的ExprCode

predicates

条件表达式。

LessThanOrEqual:小于等于;

MoreThan:。。

LessThan等

  1. predicates

定义了一系列条件表达式,如大于小于,等于,in ()操作等等。每种操作符定义一个单独的类处理,通过统一的eval()方法返回匹配的结果,是null还是false还是true。

例如:

  1. Or

或操作

override def eval(input: InternalRow): Any = {

val input1 = left.eval(input)

if (input1 == true) {

true

} else {

val input2 = right.eval(input)

if (input2 == true) {

true

} else {

if (input1 != null && input2 != null) {

false

} else {

null

}

}

}

}

left和right只要满足一个就返回true,只要有一个是null则返回null,否则返回false。

再看一个And

  1. And

override def eval(input: InternalRow): Any = {

val input1 = left.eval(input)

if (input1 == false) {

false

} else {

val input2 = right.eval(input)

if (input2 == false) {

false

} else {

if (input1 != null && input2 != null) {

true

} else {

null

}

}

}

}

left和right只要一个为false则返回false,如果有null则返回null,否则返回true。

其他的就不列举了。

  1. Expression

Expression:函数表达式,如name(string)这样的定义格式。

LeafExpression:没有子节点。child为nil

UnaryExpression:一个子节点。children只有一个元素[child]

BinaryExpression:两个子节点

TernaryExpression:三个子节点

TernaryExpression:特殊的BinaryExpression,两个子节点有相同的输出数据类型。

每个列的值先是Expression,然后Seq[Expression]解析成InternalRow

Expression是TreeNode的子类。

大部分的Expression子类应该都是继承UnaryExpression或者BinaryExpression。

  1. NamedExpressions

命名表达式,判断select后多个列表达式是否指向同一个,或者对sql语句进行预处理,转换列表达式。

其中一个重载方式sql,返回处理后的sql语句。

  1. UnaryExpression

只有一个child,children也是只有一个child的列表。

override def eval(input: InternalRow): Any = {

val value = child.eval(input)

if (value == null) {

null

} else {

nullSafeEval(value)

}

}

protected def nullSafeEval(input: Any): Any =

sys.error(s"UnaryExpressions must override either eval or nullSafeEval")

当子类继承UnaryExpression时,可能需要重写eval和nullSafeEval两个方法。

defineCodeGen方法:返回java source代码。可以重写。

  1. BinaryExpression

继承Expression,两个输入,一个输出。也是一个基类,不直接使用。

  1. BinaryOperator

继承BinaryExpression。是一个抽象类,表达式格式:

是类似"x symbol y", 而不是"funcName(x, y)".

主要是一个方法的重写:

override def sql: String = s"(${left.sql} $sqlOperator ${right.sql})"

输出sql语句。

转载于:https://my.oschina.net/u/778683/blog/1831254

Spark Catalyst相关推荐

  1. 【Spark】扩展Spark Catalyst,打造自定义的Spark SQL引擎

    1.概述 转载自:扩展Spark Catalyst,打造自定义的Spark SQL引擎 Apache Spark是大数据处理领域最常用的计算引擎之一,被应用在各种各样的场景中,除了易用的API,稳定高 ...

  2. Spark 开源新特性:Catalyst 优化流程裁剪

    摘要:为了解决过多依赖 Hive 的问题, SparkSQL 使用了一个新的 SQL 优化器替代 Hive 中的优化器, 这个优化器就是 Catalyst. 本文分享自华为云社区<Spark 开 ...

  3. 基于Spark的大规模推荐系统特征工程

    分享嘉宾:陈迪豪 第四范式 架构师 编辑整理:刘璐 出品平台:第四范式天枢.DataFunTalk 导读:特征工程在推荐系统中有着举足轻重的作用,大规模特征工程处理的效率极大的影响了推荐系统线上的性能 ...

  4. 必看!Spark 进阶之路之「SparkSQL」入门概述 | 博文精选

    作者 | Alice菌 责编 | Carol 来源 | CSDN 博客 封图 | CSDN付费下载于视觉中国 在之前的文章中,我们已经完成了对于Spark核心SparkCore的详细介绍.而今天想为为 ...

  5. Spark之SparkSQL理论篇

    Spark SQL 理论学习: 简介 Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用. 特点 1)易整合 2) ...

  6. Spark SQL概述

    1.介绍 Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用.使用Spark SQL有两种方式,包括SQL语句以及 ...

  7. Cris 的 Spark SQL 笔记

    一.Spark SQL 概述 1.1 什么是Spark SQL Spark SQL 是 Spark 用来处理结构化数据的一个模块,它提供了2个编程抽象: DataFrame 和DataSet,并且作为 ...

  8. Spark SQL概述及其基本用法

    Spark SQL概述 Spark SQL是什么 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块. Spark SQL 的前身是Shark ...

  9. 极光笔记丨Spark SQL 在极光的建设实践

    作者:极光高级工程师-蔡祖光 前言 Spark在2018开始在极光大数据平台部署使用,历经多个版本的迭代,逐步成为离线计算的核心引擎.当前在极光大数据平台每天运行的Spark任务有20000+,执行的 ...

最新文章

  1. 基础篇9-python基本数据结构-列表
  2. mac上使用crontab周期性执行python脚本
  3. 开源性能监控工具APM之Skywalking和Pinpoint的实测对比
  4. 需求分析的过程是什么?_7大需求分析方法与5大分析过程
  5. 怎么用python做我的世界皮肤_Python爬取mc皮肤【爬虫项目】
  6. CSS-----盒子模型
  7. PostgreSQL内核扩展之 - ElasticSearch同步插件
  8. nodejs 实现 磁力链接资源搜索 BT磁力链接爬虫
  9. Python代码整洁之道勘误
  10. basic4android 开发 使用类库方法
  11. Visual studio插件:Visual Svn 替代工具--AnkhSvn
  12. docker默认ip查询
  13. STL——标准模板库
  14. python+selenium高级教程
  15. python3.7通过itchat方式登录微信给好友发送天气信息
  16. 知道创宇入选第九届CNCERT国家级网络安全应急服务支撑单位
  17. js获取当前日期前12月后12月日期
  18. OS20190301
  19. [论文解读]Going out on a limb: Joint Extraction of Entity Mentions and Relations without...
  20. Revit模型在Web端展示的免费方案

热门文章

  1. 阿里云发布新一代CDN 6.0 主打云与大数据融合
  2. linux设备驱动学习笔记(1)
  3. 用tarball实现liferay自动安装部署15-复制定制后的catalina.sh
  4. POJ 1426 Find The Multiple
  5. 求助请IT外包商如何帮用户管好网络?
  6. iOS 隐藏导航栏整个视图上移闪屏问题
  7. 让Linux系统开机速度更快的方法
  8. 想充分利用NFV?Cloud Native是个好方法
  9. 2015.7.13 第五课 课程重点(z-index、overflow、浏览器兼容性)
  10. 使用PHP自带zlib函数 几行代码实现PHP文件打包下载zip