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

Catalog提供一些API用来对数据库、表、视图、缓存、列、函数(UDF/UDAF)进行操作,下文将一一介绍。
二、如何使用Catalog
得到Catalog:
val spark = SparkSession.builder().master("local[*]").appName("catalog-study").getOrCreate()
val catalog = spark.catalog
Catalog相关的代码存放在org.apache.spark.sql.catalog下:

上面的Catalog只是一个接口定义规范,具体实现还有一个org.apache.spark.sql.internal.CatalogImpl,如果只是使用Spark完成工作的话只阅读接口定义基本够用了。
三、相关API
数据库相关
看数据库相关的操作之前先看一下Catalog对数据库的表示:
/**
* A database in Spark, as returned by the `listDatabases` method defined in [[Catalog]].
*
* @param name name of the database.
* @param description description of the database.
* @param locationUri path (in the form of a uri) to data files.
* @since 2.0.0
*/
@InterfaceStability.Stable
class Database(
val name: String,
@Nullable val description: String,
val locationUri: String)
extends DefinedByConstructorParams { override def toString: String = {
"Database[" +
s"name='$name', " +
Option(description).map { d => s"description='$d', " }.getOrElse("") +
s"path='$locationUri']"
} }
Catalog使用三个字段表示一个数据库:
name:数据库名字
descripttion:数据库描述,可以认为是注释
locationUri:数据库的数据保存位置
currentDatabase: String
返回当前使用的数据库,相当于select database();
setCurrentDatabase(dbName: String): Unit
设置当前使用的数据库,相当于use database_name;
listDatabases(): Dataset[Database]
查看所有数据库,相当于show databases;
getDatabase(dbName: String): Database
获取某数据库的元数据,返回值是Database类型的,如果指定的数据库不存在则会@throws[AnalysisException]("database does not exist")
databaseExists(dbName: String): Boolean
判断某个数据库是否已经存在,返回boolean值。
为了避免抛异常对单个数据库进行getDatabase获取元数据之前还是先使用databaseExists确定数据库已经存在。
表/视图相关
同样的,对表或视图Catalog也用一个class来表示:
/**
* A table in Spark, as returned by the `listTables` method in [[Catalog]].
*
* @param name name of the table.
* @param database name of the database the table belongs to.
* @param description description of the table.
* @param tableType type of the table (e.g. view, table).
* @param isTemporary whether the table is a temporary table.
* @since 2.0.0
*/
@InterfaceStability.Stable
class Table(
val name: String,
@Nullable val database: String,
@Nullable val description: String,
val tableType: String,
val isTemporary: Boolean)
extends DefinedByConstructorParams { override def toString: String = {
"Table[" +
s"name='$name', " +
Option(database).map { d => s"database='$d', " }.getOrElse("") +
Option(description).map { d => s"description='$d', " }.getOrElse("") +
s"tableType='$tableType', " +
s"isTemporary='$isTemporary']"
} }
name:表的名字
database:表所属的数据库的名字
description:表的描述信息
tableType:用于区分是表还是视图,两个取值:table或view。
isTemporary:是否是临时表或临时视图,解释一下啥是临时表,临时表就是使用Dataset或DataFrame的createOrReplaceTempView等类似的API注册的视图或表,当此次Spark任务结束后这些表就没了,再次使用的话还要再进行注册,而非临时表就是在Hive中真实存在的,开启Hive支持就能够直接使用的,本次Spark任务结束后表仍然能存在,下次启动不需要重新做任何处理就能够使用,表是持久的,这种不是临时表。
listTables(): Dataset[Table]
查看所有表或视图,相当于show tables;
listTables(dbName: String): Dataset[Table]
返回指定数据库下的表或视图,如果指定的数据库不存在则会抛出@throws[AnalysisException]("database does not exist")表示数据库不存在。
getTable(tableName: String): Table
getTable(dbName: String, tableName: String): Table
获取表的元信息,不存在则会抛出异常。
tableExists(tableName: String): Boolean
tableExists(dbName: String, tableName: String): Boolean
判断表或视图是否存在,返回boolean值。
dropTempView(viewName: String): Boolean
dropGlobalTempView(viewName: String): Boolean
使用createOrReplaceTempView类似API注册的临时视图可以使用此方法删除,如果这个视图已经被缓存过的话会自动清除缓存。
recoverPartitions(tableName: String): Unit
isCached(tableName: String): Boolean
用于判断一个表否已经缓存过了。
cacheTable(tableName: String): Unit
cacheTable(tableName: String, storageLevel: StorageLevel): Unit
用于缓存表
uncacheTable(tableName: String): Unit
对表取消缓存
clearCache(): Unit
清空所有缓存
refreshTable(tableName: String): Unit
Spark为了性能考虑,对表的元数据做了缓存,所以当被缓存的表已经改变时也必须刷新元数据重新缓存。
refreshByPath(path: String): Unit
createTable(tableName: String, path: String): DataFrame
createTable(tableName: String, path: String, source: String): DataFrame
createTable(tableName: String, source: String, options: java.util.Map[String, String]): DataFrame
createTable(tableName: String, source: String, options: Map[String, String]): DataFrame
createTable(tableName: String, source: String, schema: StructType, options: java.util.Map[String, String]): DataFrame
createTable(tableName: String, source: String, schema: StructType, options: Map[String, String]): DataFrame
函数相关
Catalog对函数的表示:
/**
* A user-defined function in Spark, as returned by `listFunctions` method in [[Catalog]].
*
* @param name name of the function.
* @param database name of the database the function belongs to.
* @param description description of the function; description can be null.
* @param className the fully qualified class name of the function.
* @param isTemporary whether the function is a temporary function or not.
* @since 2.0.0
*/
@InterfaceStability.Stable
class Function(
val name: String,
@Nullable val database: String,
@Nullable val description: String,
val className: String,
val isTemporary: Boolean)
extends DefinedByConstructorParams { override def toString: String = {
"Function[" +
s"name='$name', " +
Option(database).map { d => s"database='$d', " }.getOrElse("") +
Option(description).map { d => s"description='$d', " }.getOrElse("") +
s"className='$className', " +
s"isTemporary='$isTemporary']"
} }
name:函数的名字
database:函数注册在哪个数据库下,函数是跟数据库绑定的
description:对函数的描述信息,可以理解成注释
className:函数其实就是一个class,调用函数就是调用类的方法,className表示函数对应的class的全路径类名
isTemporary:是否是临时函数。
listFunctions(): Dataset[Function]
列出当前数据库下的所有函数,包括注册的临时函数。
listFunctions(dbName: String): Dataset[Function]
列出指定数据库下注册的所有函数,包括临时函数,如果指定的数据库不存在的话则会抛出@throws[AnalysisException]("database does not exist")表示数据库不存在。
getFunction(functionName: String): Function
getFunction(dbName: String, functionName: String): Function
获取函数的元信息,函数不存在则会抛出异常。
functionExists(functionName: String): Boolean
functionExists(dbName: String, functionName: String): Boolean
判断函数是否存在,返回boolean值。
对表或视图的列相关的操作
Catalog对列的表示:
/**
* A column in Spark, as returned by `listColumns` method in [[Catalog]].
*
* @param name name of the column.
* @param description description of the column.
* @param dataType data type of the column.
* @param nullable whether the column is nullable.
* @param isPartition whether the column is a partition column.
* @param isBucket whether the column is a bucket column.
* @since 2.0.0
*/
@InterfaceStability.Stable
class Column(
val name: String,
@Nullable val description: String,
val dataType: String,
val nullable: Boolean,
val isPartition: Boolean,
val isBucket: Boolean)
extends DefinedByConstructorParams { override def toString: String = {
"Column[" +
s"name='$name', " +
Option(description).map { d => s"description='$d', " }.getOrElse("") +
s"dataType='$dataType', " +
s"nullable='$nullable', " +
s"isPartition='$isPartition', " +
s"isBucket='$isBucket']"
} }
name:列的名字
description:列的描述信息,与注释差不多
dataType:列的数据类型
nullable:列是否允许为null
isPartition:是否是分区列
isBucket:是否是桶列
listColumns(tableName: String): Dataset[Column]
listColumns(dbName: String, tableName: String): Dataset[Column]
列出指定的表或视图有哪些列,表不存在则抛异常。
相关资料:
1. Spark 2.0介绍:Catalog API介绍和使用
.
Spark笔记之Catalog的更多相关文章
- spark笔记 环境配置
spark笔记 spark简介 saprk 有六个核心组件: SparkCore.SparkSQL.SparkStreaming.StructedStreaming.MLlib,Graphx Spar ...
- 大数据学习——spark笔记
变量的定义 val a: Int = 1 var b = 2 方法和函数 区别:函数可以作为参数传递给方法 方法: def test(arg: Int): Int=>Int ={ 方法体 } v ...
- spark 笔记 16: BlockManager
先看一下原理性的文章:http://jerryshao.me/architecture/2013/10/08/spark-storage-module-analysis/ ,http://jerrys ...
- spark 笔记 15: ShuffleManager,shuffle map两端的stage/task的桥梁
无论是Hadoop还是spark,shuffle操作都是决定其性能的重要因素.在不能减少shuffle的情况下,使用一个好的shuffle管理器也是优化性能的重要手段. ShuffleManager的 ...
- spark 笔记 14: spark中的delay scheduling实现
延迟调度算法的实现是在TaskSetManager类中的,它通过将task存放在四个不同级别的hash表里,当有可用的资源时,resourceOffer函数的参数之一(maxLocality)就是这些 ...
- spark 笔记 12: Executor,task最后的归宿
spark的Executor是执行task的容器.和java的executor概念类似. ===================start executor runs task============ ...
- spark 笔记 11: SchedulingAlgorithm 两种调度算法的优先级比较
调度算法的最基本工作之一,就是比较两个可执行的task的优先级.spark提供的FIFO和FAIR的优先级比较在SchedulingAlgorithm这个接口体现.) { ) { ) { ) { fa ...
- spark 笔记 10: TaskScheduler相关
任务调度器的接口类.应用程序可以定制自己的调度器来执行.当前spark只实现了一个任务调度器) )))))val createTime = System.currentTimeMillis()clas ...
- spark 笔记 8: Stage
Stage 是一组独立的任务,他们在一个job中执行相同的功能(function),功能的划分是以shuffle为边界的.DAG调度器以拓扑顺序执行同一个Stage中的task. /** * A st ...
随机推荐
- shell 的 export命令
export 功能说明:设置或显示环境变量.语 法:export [-fnp][变量名称]=[变量设置值]补充说明:在shell中执行程序时,shell会提供一组环境变量.export可新增,修改或删 ...
- FPGA千兆位收发器选择指南
选择合适的千兆位收发器(GT)是通信和实时处理领域尤其需要重点考虑的设计事项,但特定的市场领域可能会存在太多的标准.协议或使用模型.有时针对某一种应用就会涉及到好几种标准,为了选择最适合的千兆位收发器 ...
- Linux内核分析作业 NO.2
操作系统是如何工作的 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...
- 冲刺Two之站立会议6
今天继续了昨天的工作,对视频进行优化.因为昨天的工作没有达到预期的效果,所以又继续对音质和画面质量做了相应的优化.还对相应的聊天室界面进行了优化.
- 第二个spring冲刺第5天
针对与昨天的讨论内容,今天进行了开会研讨给意见. 在今天中有了点进展,各方面都有改善,离程序的完成度又前进了一大步.
- jsp数据库开发
完全卸载mysql数据库图文教程 https://jingyan.baidu.com/article/f96699bbaa8fc1894f3c1b5a.html MySQl:123456 JDBC概述 ...
- java 多维数据定义
//一维数组定义与输出class less02{ public static void main(String[] args) { int stu[]=new int[]{1,2 ...
- OneZero第二周第四次站立会议(2016.3.31)
会议时间:2016年3月30日 13:00~13:20 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:汇报前一天工作,全体成员评论,确定会后修改内容或分配下一步任务. 会议内容: 1.前端,夏.张 ...
- Java == ,equals 和 hashcode 的区别和联系(阿里面试)
今天阿里的人问我 equals 与hashcode的区别,我答不上来, 仔细查了一下,做了总结: (1) == 这是Java 比较内存地址,就是内存中的对象: java中的==是比较两个对象在JVM中 ...
- JDK8新特性,方法的引用
引用方法并运行 在Java中,方法和构造方法都看作是对象的一种,那么你要引用它(不是调用),则可以用::来引用.用来存储这个引用的类型用@FunctionlaInterface注解来标识. 示例: p ...