一、什么是Catalog

Spark SQL提供了执行sql语句的支持,sql语句是以表的方式组织使用数据的,而表本身是如何组织存储的呢,肯定是存在一些元数据之类的东西了,Catalog就是Spark 2.0之后提供的访问元数据的类:

Catalog提供一些API用来对数据库、表、视图、缓存、列、函数(UDF/UDAF)进行操作,下文将一一介绍。

二、如何使用Catalog

得到Catalog:

  1. val spark = SparkSession.builder().master("local[*]").appName("catalog-study").getOrCreate()
  2. val catalog = spark.catalog

Catalog相关的代码存放在org.apache.spark.sql.catalog下:

上面的Catalog只是一个接口定义规范,具体实现还有一个org.apache.spark.sql.internal.CatalogImpl,如果只是使用Spark完成工作的话只阅读接口定义基本够用了。

三、相关API

数据库相关

看数据库相关的操作之前先看一下Catalog对数据库的表示:

  1. /**
  2. * A database in Spark, as returned by the `listDatabases` method defined in [[Catalog]].
  3. *
  4. * @param name name of the database.
  5. * @param description description of the database.
  6. * @param locationUri path (in the form of a uri) to data files.
  7. * @since 2.0.0
  8. */
  9. @InterfaceStability.Stable
  10. class Database(
  11. val name: String,
  12. @Nullable val description: String,
  13. val locationUri: String)
  14. extends DefinedByConstructorParams {
  15.  
  16. override def toString: String = {
  17. "Database[" +
  18. s"name='$name', " +
  19. Option(description).map { d => s"description='$d', " }.getOrElse("") +
  20. s"path='$locationUri']"
  21. }
  22.  
  23. }

Catalog使用三个字段表示一个数据库:

name:数据库名字

descripttion:数据库描述,可以认为是注释

locationUri:数据库的数据保存位置

  1. currentDatabase: String

返回当前使用的数据库,相当于select database();

  1. setCurrentDatabase(dbName: String): Unit

设置当前使用的数据库,相当于use database_name;

  1. listDatabases(): Dataset[Database]

查看所有数据库,相当于show databases;

  1. getDatabase(dbName: String): Database

获取某数据库的元数据,返回值是Database类型的,如果指定的数据库不存在则会@throws[AnalysisException]("database does not exist")

  1. databaseExists(dbName: String): Boolean

判断某个数据库是否已经存在,返回boolean值。

为了避免抛异常对单个数据库进行getDatabase获取元数据之前还是先使用databaseExists确定数据库已经存在。

表/视图相关

同样的,对表或视图Catalog也用一个class来表示:

  1. /**
  2. * A table in Spark, as returned by the `listTables` method in [[Catalog]].
  3. *
  4. * @param name name of the table.
  5. * @param database name of the database the table belongs to.
  6. * @param description description of the table.
  7. * @param tableType type of the table (e.g. view, table).
  8. * @param isTemporary whether the table is a temporary table.
  9. * @since 2.0.0
  10. */
  11. @InterfaceStability.Stable
  12. class Table(
  13. val name: String,
  14. @Nullable val database: String,
  15. @Nullable val description: String,
  16. val tableType: String,
  17. val isTemporary: Boolean)
  18. extends DefinedByConstructorParams {
  19.  
  20. override def toString: String = {
  21. "Table[" +
  22. s"name='$name', " +
  23. Option(database).map { d => s"database='$d', " }.getOrElse("") +
  24. Option(description).map { d => s"description='$d', " }.getOrElse("") +
  25. s"tableType='$tableType', " +
  26. s"isTemporary='$isTemporary']"
  27. }
  28.  
  29. }

name:表的名字

database:表所属的数据库的名字

description:表的描述信息

tableType:用于区分是表还是视图,两个取值:table或view。

isTemporary:是否是临时表或临时视图,解释一下啥是临时表,临时表就是使用Dataset或DataFrame的createOrReplaceTempView等类似的API注册的视图或表,当此次Spark任务结束后这些表就没了,再次使用的话还要再进行注册,而非临时表就是在Hive中真实存在的,开启Hive支持就能够直接使用的,本次Spark任务结束后表仍然能存在,下次启动不需要重新做任何处理就能够使用,表是持久的,这种不是临时表。

  1. listTables(): Dataset[Table]

查看所有表或视图,相当于show tables;

  1. listTables(dbName: String): Dataset[Table]

返回指定数据库下的表或视图,如果指定的数据库不存在则会抛出@throws[AnalysisException]("database does not exist")表示数据库不存在。

  1. getTable(tableName: String): Table
  2. getTable(dbName: String, tableName: String): Table

获取表的元信息,不存在则会抛出异常。

  1. tableExists(tableName: String): Boolean
  2. tableExists(dbName: String, tableName: String): Boolean

判断表或视图是否存在,返回boolean值。

  1. dropTempView(viewName: String): Boolean
  2. dropGlobalTempView(viewName: String): Boolean

使用createOrReplaceTempView类似API注册的临时视图可以使用此方法删除,如果这个视图已经被缓存过的话会自动清除缓存。

  1. recoverPartitions(tableName: String): Unit
  1. isCached(tableName: String): Boolean

用于判断一个表否已经缓存过了。

  1. cacheTable(tableName: String): Unit
  2. cacheTable(tableName: String, storageLevel: StorageLevel): Unit

用于缓存表

  1. uncacheTable(tableName: String): Unit

对表取消缓存

  1. clearCache(): Unit

清空所有缓存

  1. refreshTable(tableName: String): Unit

Spark为了性能考虑,对表的元数据做了缓存,所以当被缓存的表已经改变时也必须刷新元数据重新缓存。

  1. refreshByPath(path: String): Unit
  1. createTable(tableName: String, path: String): DataFrame
  2. createTable(tableName: String, path: String, source: String): DataFrame
  3. createTable(tableName: String, source: String, options: java.util.Map[String, String]): DataFrame
  4. createTable(tableName: String, source: String, options: Map[String, String]): DataFrame
  5. createTable(tableName: String, source: String, schema: StructType, options: java.util.Map[String, String]): DataFrame
  6. createTable(tableName: String, source: String, schema: StructType, options: Map[String, String]): DataFrame
  1.  

函数相关

Catalog对函数的表示:

  1. /**
  2. * A user-defined function in Spark, as returned by `listFunctions` method in [[Catalog]].
  3. *
  4. * @param name name of the function.
  5. * @param database name of the database the function belongs to.
  6. * @param description description of the function; description can be null.
  7. * @param className the fully qualified class name of the function.
  8. * @param isTemporary whether the function is a temporary function or not.
  9. * @since 2.0.0
  10. */
  11. @InterfaceStability.Stable
  12. class Function(
  13. val name: String,
  14. @Nullable val database: String,
  15. @Nullable val description: String,
  16. val className: String,
  17. val isTemporary: Boolean)
  18. extends DefinedByConstructorParams {
  19.  
  20. override def toString: String = {
  21. "Function[" +
  22. s"name='$name', " +
  23. Option(database).map { d => s"database='$d', " }.getOrElse("") +
  24. Option(description).map { d => s"description='$d', " }.getOrElse("") +
  25. s"className='$className', " +
  26. s"isTemporary='$isTemporary']"
  27. }
  28.  
  29. }

name:函数的名字

database:函数注册在哪个数据库下,函数是跟数据库绑定的

description:对函数的描述信息,可以理解成注释

className:函数其实就是一个class,调用函数就是调用类的方法,className表示函数对应的class的全路径类名

isTemporary:是否是临时函数。

  1. listFunctions(): Dataset[Function]

列出当前数据库下的所有函数,包括注册的临时函数。

  1. listFunctions(dbName: String): Dataset[Function]

列出指定数据库下注册的所有函数,包括临时函数,如果指定的数据库不存在的话则会抛出@throws[AnalysisException]("database does not exist")表示数据库不存在。

  1. getFunction(functionName: String): Function
  2. getFunction(dbName: String, functionName: String): Function

获取函数的元信息,函数不存在则会抛出异常。

  1. functionExists(functionName: String): Boolean
  2. functionExists(dbName: String, functionName: String): Boolean

判断函数是否存在,返回boolean值。

对表或视图的列相关的操作

Catalog对列的表示:

  1. /**
  2. * A column in Spark, as returned by `listColumns` method in [[Catalog]].
  3. *
  4. * @param name name of the column.
  5. * @param description description of the column.
  6. * @param dataType data type of the column.
  7. * @param nullable whether the column is nullable.
  8. * @param isPartition whether the column is a partition column.
  9. * @param isBucket whether the column is a bucket column.
  10. * @since 2.0.0
  11. */
  12. @InterfaceStability.Stable
  13. class Column(
  14. val name: String,
  15. @Nullable val description: String,
  16. val dataType: String,
  17. val nullable: Boolean,
  18. val isPartition: Boolean,
  19. val isBucket: Boolean)
  20. extends DefinedByConstructorParams {
  21.  
  22. override def toString: String = {
  23. "Column[" +
  24. s"name='$name', " +
  25. Option(description).map { d => s"description='$d', " }.getOrElse("") +
  26. s"dataType='$dataType', " +
  27. s"nullable='$nullable', " +
  28. s"isPartition='$isPartition', " +
  29. s"isBucket='$isBucket']"
  30. }
  31.  
  32. }

name:列的名字

description:列的描述信息,与注释差不多

dataType:列的数据类型

nullable:列是否允许为null

isPartition:是否是分区列

isBucket:是否是桶列

  1. listColumns(tableName: String): Dataset[Column]
  2. listColumns(dbName: String, tableName: String): Dataset[Column]

列出指定的表或视图有哪些列,表不存在则抛异常。

相关资料:

1.  Spark 2.0介绍:Catalog API介绍和使用

2. Java Doc: Class Catalog

.

Spark笔记之Catalog的更多相关文章

  1. spark笔记 环境配置

    spark笔记 spark简介 saprk 有六个核心组件: SparkCore.SparkSQL.SparkStreaming.StructedStreaming.MLlib,Graphx Spar ...

  2. 大数据学习——spark笔记

    变量的定义 val a: Int = 1 var b = 2 方法和函数 区别:函数可以作为参数传递给方法 方法: def test(arg: Int): Int=>Int ={ 方法体 } v ...

  3. spark 笔记 16: BlockManager

    先看一下原理性的文章:http://jerryshao.me/architecture/2013/10/08/spark-storage-module-analysis/ ,http://jerrys ...

  4. spark 笔记 15: ShuffleManager,shuffle map两端的stage/task的桥梁

    无论是Hadoop还是spark,shuffle操作都是决定其性能的重要因素.在不能减少shuffle的情况下,使用一个好的shuffle管理器也是优化性能的重要手段. ShuffleManager的 ...

  5. spark 笔记 14: spark中的delay scheduling实现

    延迟调度算法的实现是在TaskSetManager类中的,它通过将task存放在四个不同级别的hash表里,当有可用的资源时,resourceOffer函数的参数之一(maxLocality)就是这些 ...

  6. spark 笔记 12: Executor,task最后的归宿

    spark的Executor是执行task的容器.和java的executor概念类似. ===================start executor runs task============ ...

  7. spark 笔记 11: SchedulingAlgorithm 两种调度算法的优先级比较

    调度算法的最基本工作之一,就是比较两个可执行的task的优先级.spark提供的FIFO和FAIR的优先级比较在SchedulingAlgorithm这个接口体现.) { ) { ) { ) { fa ...

  8. spark 笔记 10: TaskScheduler相关

    任务调度器的接口类.应用程序可以定制自己的调度器来执行.当前spark只实现了一个任务调度器) )))))val createTime = System.currentTimeMillis()clas ...

  9. spark 笔记 8: Stage

    Stage 是一组独立的任务,他们在一个job中执行相同的功能(function),功能的划分是以shuffle为边界的.DAG调度器以拓扑顺序执行同一个Stage中的task. /** * A st ...

随机推荐

  1. SDN竞赛思考总结

    SDN竞赛思考总结 2016年下半年张老师开始着手组建SDN小组,从未接触过任何网络知识的我也有幸成为小组一员.从最开始刷Openflow交换机,Get了刷交换机的新技能;到P4FPGA的无疾而终,表 ...

  2. 接上 操作系统java项目设计图纸 一步一步在进化

  3. 完善好的web项目(校园包车)

  4. BUG报告

    Bug1 1.看到的现象:如果在注册时使用中文作为密码,并不会报错,但是登陆过程中的密码框却不能输入中文导致无法登陆. 2.期待的现象:登陆也能支持中文或在注册功能中添加输入约束. 3.二者的差异 在 ...

  5. php排序学习之-冒泡排序

    原理:对一组数据,比较相邻数据的大小,将值小数据在前面,值大的数据放在后面.   (以下都是升序排列,即从小到大排列) 举例说明: $arr = array(6, 3, 8, 2, 9, 1); $a ...

  6. Windows server 自带的 .net版本

    1. Win2012r2 所带的版本: 2. Win2016 所带的版本 4.6 Win2019 自带的 .net版本为: 4.7 4. 然后比较 Win2008r2sp1 使用的是 .net3.5 ...

  7. Java 8新特性之接口改善(八恶人-1)

    Daisy Donergue 多莫歌·黛西 “By woman, you mean her?” 她也能叫女人? Java 8在13年9月发布,写这篇博文的时间已经是17年12月份了.来的有点晚,但是有 ...

  8. 搜索引擎(Solr-搜索详解)

    学习目标 1.掌握SOLR的搜索工作流程: 2.掌握solr搜索的表示语法及查询解析器 3.熟悉solr搜索的JSON格式 API Solr搜索流程介绍 回顾,使用 lucene进行搜索的步骤: So ...

  9. LCP 模板

    LCP Description 给定串 \(S\) . \(m\) 组询问 \((X, Y, L, R)\): 求 \(S[X,Y]\) 与 \(S[L,R]\) 的最长公共前缀. Input 第一行 ...

  10. 洛谷P3241 开店

    题意:紫妹和幽香是17岁的少女,喜欢可爱的东西. 给定一棵树,有点权,边权.每次求所有权值在[l, r]范围内的点到点x的距离和.强制在线. 解:动态点分治怎么搞啊...... 一开始想的是权值的限制 ...