`
zhao_rock
  • 浏览: 190138 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

SparkSQL中DataFrame registerTempTable源码浅析

阅读更多

dataFrame.registerTempTable(tableName);
  最近在使用SparkSQL时想到1万条数据注册成临时表和1亿条数据注册成临时表时,效率上是否会有很大的差距,也对DataFrame注册成临时表到底做了哪些比较好奇,拿来源码拜读了下相关部分,记录一下。

 

临时表的生命周期是和创建该DataFrame的SQLContext有关系的,SQLContext生命周期结束,该临时表的生命周期也结束了
 

DataFrame.scala相关源码
 /**
   * Registers this [[DataFrame]] as a temporary table using the given name.  The lifetime of this
   * temporary table is tied to the [[SQLContext]] that was used to create this DataFrame.
   *
   * @group basic
   * @since 1.3.0
   */
  def registerTempTable(tableName: String): Unit = {
    sqlContext.registerDataFrameAsTable(this, tableName)
  }

  
 DataFrame中的registerTempTable调用SQLContext中的registerDataFrameAsTable,
 SQLContext中使用SimpleCatalog类去实现Catalog接口中的registerTable方法.
 

SQLContext.scala相关源码
  @transient
  protected[sql] lazy val catalog: Catalog = new SimpleCatalog(conf)
  /**
   * Registers the given [[DataFrame]] as a temporary table in the catalog. Temporary tables exist
   * only during the lifetime of this instance of SQLContext.
   */
  private[sql] def registerDataFrameAsTable(df: DataFrame, tableName: String): Unit = {
    catalog.registerTable(Seq(tableName), df.logicalPlan)
  }
    
    在SimpleCatalog中定义了Map,registerTable中按tableIdentifier为key,logicalPlan为Value注册到名为tables的map中


  Catalog.scala相关源码
  val tables = new mutable.HashMap[String, LogicalPlan]()
  override def registerTable(
      tableIdentifier: Seq[String],
      plan: LogicalPlan): Unit = {
    val tableIdent = processTableIdentifier(tableIdentifier)
    tables += ((getDbTableName(tableIdent), plan))
  }
 
  protected def processTableIdentifier(tableIdentifier: Seq[String]): Seq[String] = {
    if (conf.caseSensitiveAnalysis) {
      tableIdentifier
    } else {
      tableIdentifier.map(_.toLowerCase)
    }
  }
 
  protected def getDbTableName(tableIdent: Seq[String]): String = {
    val size = tableIdent.size
    if (size <= 2) {
      tableIdent.mkString(".")
    } else {
      tableIdent.slice(size - 2, size).mkString(".")
    }
  }

  阅读以上代码,最终registerTempTable是将表名(或表的标识)和对应的逻辑计划加载到Map中,并随着SQLContext的消亡而消亡

0
1
分享到:
评论

相关推荐

    【SparkSql篇01】SparkSql之DataFrame和DataSet1

    在实际使用中,SparkSQL的强大之处在于它可以无缝地集成SQL查询和Spark编程,允许开发人员混合使用SQL语句和Scala/Java/Python代码,极大地提升了开发效率。SparkSQL还支持通过JDBC或ODBC与其他工具和应用程序连接,...

    SparkSql和DataFrame实战.docx

    **DataFrame** 在Spark中是一个分布式的数据集,其组织方式类似于关系数据库中的表或者R/Python中的DataFrame数据结构。相比于传统的RDD(Resilient Distributed Dataset)数据结构,DataFrame提供了更加丰富的元...

    SparkSQL-DataFrame

    在SparkSQL中,DataFrame是一个不可变的数据结构,它是由一系列的列组成,每列都有自己的名字和数据类型。DataFrame的底层实现基于Spark的RDD(弹性分布式数据集)和Dataset,这使得DataFrame具有高度优化的执行计划...

    SparkSQL中创建DataFrame需要的数据(user.csv)

    SparkSQL中创建DataFrame需要的数据(user.csv)

    SparkSQL的数据结构DataFrame构建方式

    在Spark源码中,`DataFrame`类是`org.apache.spark.sql.Dataset[Row]`的子类,`DataFrameReader`和`DataFrameWriter`则分别为`DataFrame`的读写接口。在`SparkSession.createDataFrame()`中,会调用`...

    SparkSQL通过Hive创建DataFrame

    SparkSQL通过Hive创建DataFrame问题分析 问题一 Caused by: org.apache.spark.sql.catalyst.analysis.NoSuchTableException: Table or view 'stu' not found in database 'default'; 分析:确实没有临时表View,...

    倒排索引源码java-spark-in-practice:Spark入门、SparkStreaming、SparkSQL、DataFrame

    倒排索引源码 java 车间火花实践 在本次研讨会中,练习的重点是使用 和 API,以及数据处理。 练习在 Java 和我的 github 帐户中都可用(这里是 java)。 你只需要克隆项目就可以了! 如果您需要帮助,请查看解决方案...

    spark course pdf

    1. SparkSQL与DataFrame:SparkSQL是Spark框架中用于结构化数据处理的部分,它将SQL查询语言引入到Spark,使得开发人员可以方便地使用SQL对分布式数据进行操作。DataFrame则是一种分布式的、带有列名的数据集,它是...

    DataFrame:通过SparkSql将scala类转为DataFrame的方法

    SparkSql 将 Scala 类转换为 DataFrame 的方法 通过 SparkSql 将 Scala 类转换为 DataFrame 的方法是非常重要的知识点之一。今天,我们将分享一种使用 SparkSql 将 Scala 类转换为 DataFrame 的方法,并详细解释每...

    Python 将DataFrame数据转换成元组 Python源码

    Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成...

    【Python】Pandas中DataFrame基本函数及举例整理

    目录介绍Pandas中DataFrame基本函数整理(全)构造数据框属性和数据类型转换索引和迭代二元运算函数应用&分组&窗口描述统计学从新索引&选取&标签操作处理缺失值从新定型&排序&转变形态Combining& joining&merging...

    SparkSQ操作DataFrame,合并DataFrame

    例子中定义了多个List数据集合,包括用户信息,订单信息,用户订单信息,将List对象生成DataFrame,使用SparkSQL查询将多个DataFrame合成一个DataFrame,使用Scala语言编写。

    SparkSQL入门级教程

    在 SparkSQL 中,DataFrame 是核心的数据抽象,它代表了一种分布式的、可以进行优化的数据集合,类似于传统关系数据库中的二维表格。 **RDD 转换为 DataFrame** RDD(Resilient Distributed Datasets)是 Spark 的...

    pandas-dataframe

    在Jupyter Notebook中,DataFrame可以直接以美观的表格形式展示,便于数据探索和分析。通过`%matplotlib inline`指令,还可以结合Matplotlib进行数据可视化。 **9. 高级功能** - 分块读取大文件:`pd.read_csv()`...

    Python 将DataFrame数据转换成列表 Python源码

    Python 将DataFrame数据转换成列表 Python源码Python 将DataFrame数据转换成列表 Python源码Python 将DataFrame数据转换成列表 Python源码Python 将DataFrame数据转换成列表 Python源码Python 将DataFrame数据转换成...

    Spark SQL源码概览.zip

    DataFrame是Spark SQL中的关键抽象,它代表了一张无模式的二维表格,支持SQL查询。Dataset API在DataFrame之上提供了类型安全的编程接口,利用了Scala和Java的强类型特性。 3. **Catalyst优化**: Catalyst优化器...

    价值上万的视频教程互联网程序开发+大数据+Hadoop、hive、Spark

    lg大数据高薪训练营 HBase、 Java9 、Java10 、MySQL优化 、JVM原理 、JUC多线程、 CDH版Hadoop Impala、 Flume 、Sqoop、 Azkaban、 Oozie、 HUE、 Kettle、 ...· SparkSQL · DataFrame · DataSet · 自定义

    Python 将DataFrame数据转成字典 Python源码

    Python 将DataFrame数据转成字典 Python源码Python 将DataFrame数据转成字典 Python源码Python 将DataFrame数据转成字典 Python源码Python 将DataFrame数据转成字典 Python源码Python 将DataFrame数据转成字典 ...

    sparkSQL底层实现原理-sparkSQL调优资料包附课件、代码、资料

    SparkSQL的主要优点在于它的高性能、可扩展性和易用性,使得数据科学家和开发人员可以方便地在DataFrame和Dataset上执行SQL查询。下面将详细讨论SparkSQL的底层实现原理及其调优策略。 一、SparkSQL的底层实现原理 ...

Global site tag (gtag.js) - Google Analytics