Spark Catalyst
2019独角兽企业重金招聘Python工程师标准>>>
解析sql的库。
主要类
名称 |
说明 |
CodeGenerate |
代码生成器,主要对Expression生成对应的java代码,输出ExprCode。里面包含了一系列的ExprCode子类。 |
ExprCode |
生成java代码,和Expression对应。Expression还有eval方法在InternalRow上判断条件表达式是否满足。 |
Expression |
条件表达式,主要的方法是eval和genCode,后者生成对应的ExprCode |
predicates |
条件表达式。 LessThanOrEqual:小于等于; MoreThan:。。 LessThan等 |
- predicates
定义了一系列条件表达式,如大于小于,等于,in ()操作等等。每种操作符定义一个单独的类处理,通过统一的eval()方法返回匹配的结果,是null还是false还是true。
例如:
- 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
- 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。
其他的就不列举了。
- Expression
Expression:函数表达式,如name(string)这样的定义格式。
LeafExpression:没有子节点。child为nil
UnaryExpression:一个子节点。children只有一个元素[child]
BinaryExpression:两个子节点
TernaryExpression:三个子节点
TernaryExpression:特殊的BinaryExpression,两个子节点有相同的输出数据类型。
每个列的值先是Expression,然后Seq[Expression]解析成InternalRow
Expression是TreeNode的子类。
大部分的Expression子类应该都是继承UnaryExpression或者BinaryExpression。
- NamedExpressions
命名表达式,判断select后多个列表达式是否指向同一个,或者对sql语句进行预处理,转换列表达式。
其中一个重载方式sql,返回处理后的sql语句。
- 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代码。可以重写。
- BinaryExpression
继承Expression,两个输入,一个输出。也是一个基类,不直接使用。
- 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相关推荐
- 【Spark】扩展Spark Catalyst,打造自定义的Spark SQL引擎
1.概述 转载自:扩展Spark Catalyst,打造自定义的Spark SQL引擎 Apache Spark是大数据处理领域最常用的计算引擎之一,被应用在各种各样的场景中,除了易用的API,稳定高 ...
- Spark 开源新特性:Catalyst 优化流程裁剪
摘要:为了解决过多依赖 Hive 的问题, SparkSQL 使用了一个新的 SQL 优化器替代 Hive 中的优化器, 这个优化器就是 Catalyst. 本文分享自华为云社区<Spark 开 ...
- 基于Spark的大规模推荐系统特征工程
分享嘉宾:陈迪豪 第四范式 架构师 编辑整理:刘璐 出品平台:第四范式天枢.DataFunTalk 导读:特征工程在推荐系统中有着举足轻重的作用,大规模特征工程处理的效率极大的影响了推荐系统线上的性能 ...
- 必看!Spark 进阶之路之「SparkSQL」入门概述 | 博文精选
作者 | Alice菌 责编 | Carol 来源 | CSDN 博客 封图 | CSDN付费下载于视觉中国 在之前的文章中,我们已经完成了对于Spark核心SparkCore的详细介绍.而今天想为为 ...
- Spark之SparkSQL理论篇
Spark SQL 理论学习: 简介 Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用. 特点 1)易整合 2) ...
- Spark SQL概述
1.介绍 Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用.使用Spark SQL有两种方式,包括SQL语句以及 ...
- Cris 的 Spark SQL 笔记
一.Spark SQL 概述 1.1 什么是Spark SQL Spark SQL 是 Spark 用来处理结构化数据的一个模块,它提供了2个编程抽象: DataFrame 和DataSet,并且作为 ...
- Spark SQL概述及其基本用法
Spark SQL概述 Spark SQL是什么 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块. Spark SQL 的前身是Shark ...
- 极光笔记丨Spark SQL 在极光的建设实践
作者:极光高级工程师-蔡祖光 前言 Spark在2018开始在极光大数据平台部署使用,历经多个版本的迭代,逐步成为离线计算的核心引擎.当前在极光大数据平台每天运行的Spark任务有20000+,执行的 ...
最新文章
- 基础篇9-python基本数据结构-列表
- mac上使用crontab周期性执行python脚本
- 开源性能监控工具APM之Skywalking和Pinpoint的实测对比
- 需求分析的过程是什么?_7大需求分析方法与5大分析过程
- 怎么用python做我的世界皮肤_Python爬取mc皮肤【爬虫项目】
- CSS-----盒子模型
- PostgreSQL内核扩展之 - ElasticSearch同步插件
- nodejs 实现 磁力链接资源搜索 BT磁力链接爬虫
- Python代码整洁之道勘误
- basic4android 开发 使用类库方法
- Visual studio插件:Visual Svn 替代工具--AnkhSvn
- docker默认ip查询
- STL——标准模板库
- python+selenium高级教程
- python3.7通过itchat方式登录微信给好友发送天气信息
- 知道创宇入选第九届CNCERT国家级网络安全应急服务支撑单位
- js获取当前日期前12月后12月日期
- OS20190301
- [论文解读]Going out on a limb: Joint Extraction of Entity Mentions and Relations without...
- Revit模型在Web端展示的免费方案
热门文章
- 阿里云发布新一代CDN 6.0 主打云与大数据融合
- linux设备驱动学习笔记(1)
- 用tarball实现liferay自动安装部署15-复制定制后的catalina.sh
- POJ 1426 Find The Multiple
- 求助请IT外包商如何帮用户管好网络?
- iOS 隐藏导航栏整个视图上移闪屏问题
- 让Linux系统开机速度更快的方法
- 想充分利用NFV?Cloud Native是个好方法
- 2015.7.13 第五课 课程重点(z-index、overflow、浏览器兼容性)
- 使用PHP自带zlib函数 几行代码实现PHP文件打包下载zip