SparkSQL内核解析-执行全过程概述

2024-09-06 20:58

本文主要是介绍SparkSQL内核解析-执行全过程概述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大数据技术与架构

点击右侧关注,大数据开发领域最强公众号!

暴走大数据

点击右侧关注,暴走大数据!

从SQL到RDD

// 创建SparkSession类。从2.0开始逐步替代SparkContext称为Spark应用入口
var spark = SparkSession.builder().appName("appName").master("local").getOrCreate()
//创建数据表并读取数据
spark.read.json("./test.json").createOrReplaceTempView("test_table")
//通过SQL进行数据分析。可输入任何满足语法的语句
spark.sql("select name from test_table where a > 1").show()
SQL转换步骤

实际转换过程

InternalRow体系

用来表示一行数据的类,根据下标来访问和操作元素,其中每一列都是Catalyst内部定义的数据类型;物理算子树产生和转换的RDD类型为RDD[InternalRow];

  • BaseGenericInternalRow 实现了InternalRow中所有定义的get类型方法,通过调用此类定义的genericGet虚函数进行,实现在下级子类中

    • GenericInternalRow 构造参数是Array[Any],采用对象数据进行底层存储,不允许通过set进行改变

    • SpecificInternalRow 构造函数是Array[MutableValue] ,运行通过set进行修改

    • MutableUnsafeRow 用来支持对特定列数据进行修改

  • JoinedRow 用户Join操作,将两个InternalRow放在一起形成新的InternalRow

  • UnsafeRow 不采用Java对象存储方式,避免GC的开销。同时对行数据进行特殊编码使得更高效(Tungsten计划)。

TreeNode体系

TreeNode是SparkSQL中所有树节点的基类,定义了通用集合操作和树遍历接口

  • Expression是Catalyst的表达式体系

  • QueryPlan下包含逻辑算子树和物理执行算子树两个子类

Catalyst还提供了节点位置功能,根据TreeNode定位到对应SQL字串中的位置,方便Debug

Expression体系

一般指不需要触发执行引擎也能直接计算的单元,如四则运算,逻辑、转换、过滤等。主要定义5个方面的操作:

Expression也是TreeNode 的子类,因此可以调用所有TreeNpde方法,也能通过多级Expression组成复杂表达式。下面列举常用Expression:

  • Nondeterministic接口(deterministic=false;foldable=false 具有不确定性的Expression,如Rand())

  • Unevaluable接口 非可执行表达式,调用eval会抛出异常。主要用于未被逻辑计划解析或优化的表达式

  • CodegenFallback接口 不支持代码生成的表达式,一般用于第三方实现的无法生成Java代码的表达式(如Hive的UDF),在接口中实现具体调用方法

  • LeafExpression 叶子节点类型的表达式,不包含任何子节点,如Star,CurrentData

  • UnaryExpression 一元类型表达式,输入涉及一个子节点,如Abs

  • BinaryExpression 二元类型表达式

  • TernaryExpression 三元类型表达式

内部数据系统

欢迎点赞+收藏+转发朋友圈素质三连

文章不错?点个【在看】吧! ????

这篇关于SparkSQL内核解析-执行全过程概述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143107

相关文章

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

利用Python和C++解析gltf文件的示例详解

《利用Python和C++解析gltf文件的示例详解》gltf,全称是GLTransmissionFormat,是一种开放的3D文件格式,Python和C++是两个非常强大的工具,下面我们就来看看如何... 目录什么是gltf文件选择语言的原因安装必要的库解析gltf文件的步骤1. 读取gltf文件2. 提

Java中的runnable 和 callable 区别解析

《Java中的runnable和callable区别解析》Runnable接口用于定义不需要返回结果的任务,而Callable接口可以返回结果并抛出异常,通常与Future结合使用,Runnab... 目录1. Runnable接口1.1 Runnable的定义1.2 Runnable的特点1.3 使用Ru

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR