spark SQL之Catalog API使用
Catalog API简介
Spark中的DataSet和Dataframe API支持结构化分析。结构化分析的一个重要的方面是管理元数据。这些元数据可能是一些临时元数据(比如临时表)、SQLContext上注册的UDF以及持久化的元数据(比如Hivemeta store或者HCatalog)。
Spark的早期版本是没有标准的API来访问这些元数据的。用户通常使用查询语句(比如show tables)来查询这些元数据。这些查询通常需要操作原始的字符串,而且不同元数据类型的操作也是不一样的。
这种情况在Spark 2.0中得到改变。Spark 2.0中添加了标准的API(称为catalog)来访问Spark SQL中的元数据。这个API既可以操作Spark SQL,也可以操作Hive元数据。
访问Catalog
Catalog可以通过SparkSession获取,下面代码展示如何获取Catalog:
import org.apache.spark.sql.SparkSession
val sparkSession = SparkSession.builder.appName("example").enableHiveSupport().getOrCreate()
val catalog = sparkSession.catalog
访问databases
我们一旦创建好catalog对象之后,我们可以使用它来查询元数据中的数据库,catalog上的API返回的结果全部都是dataset。
scala> catalog.listDatabases().show(false) +----------+--------------------+--------------------+
| name| description | locationUri |
+----------+--------------------+--------------------+
|data_clean| |hdfs://asiainfo-1...|
|default |Default Hive data...|hdfs://asiainfo-1...|
+----------+--------------------+--------------------+ scala> catalog.listDatabases().select("name").show(false)
+-----------------------+
|name |
+-----------------------+
|iteblog |
|default |
+-----------------------+
listDatabases返回元数据中所有的数据库。
默认情况下,元数据仅仅只有名为default的数据库。如果是Hive元数据,那么它会从Hive元数据中获取所有的数据库。listDatabases返回的类型是dataset,所以我们可以使用Dataset上的所有操作来查询元数据。
使用createTempView注册Dataframe
在Spark的早期版本,我们使用registerTempTable来注册Dataframe。然而在Spark 2.0中,这个API已经被遗弃了。registerTempTable名字很让人误解,因为用户会认为这个函数会将Dataframe持久化并且保证这个临时表,但是实际上并不是这样的,所以社区才有意将它替换成createTempView。createTempView的使用方法如下:
df.createTempView("temp")
查询表
正如我们可以展示出元数据中的所有数据库一样,我们也可以展示出元数据中某个数据库中的表。它会展示出Spark SQL中所有注册的临时表。同时可以展示出Hive中默认数据库(也就是default)中的表。如下:
scala> catalog.listTables().select("name").show(false)
+----------------------------------------+
|name |
+----------------------------------------+
|city_to_level |
|table2 |
|test |
|ticket_order |
|tmp1_result |
+----------------------------------------+
判断某个表是否缓存
我们可以使用Catalog提供的API来检查某个表是否缓存。如下:
scala> println(catalog.isCached("temp"))
false
上面判断temp表是否缓存,结果输出false。默认情况下表是不会被缓存的,我们可以手动缓存某个表,如下:
scala> df.cache()
res4: df.type = [_c0: string, _c1: string ... more fields] scala> println(catalog.isCached("temp"))
true
现在iteblog表已经被缓存了,所有现在的输出结构是true。
删除view
我们可以使用catalog提供的API来删除view。如果是Spark SQL情况,那么它会删除事先注册好的view;如果是hive情况,那么它会从元数据中删除表。
scala> catalog.dropTempView("iteblog"
查询已经注册的函数
我们不仅可以使用Catalog API操作表,还可以用它操作UDF。下面代码片段展示SparkSession上所有已经注册号的函数,当然也包括了Spark内置的函数。
scala> catalog.listFunctions().select("name","className","isTemporary").show(, false)
+---------------------+-----------------------------------------------------------------------+-----------+
|name |className |isTemporary|
+---------------------+-----------------------------------------------------------------------+-----------+
|! |org.apache.spark.sql.catalyst.expressions.Not |true |
|% |org.apache.spark.sql.catalyst.expressions.Remainder |true |
|& |org.apache.spark.sql.catalyst.expressions.BitwiseAnd |true |
|* |org.apache.spark.sql.catalyst.expressions.Multiply |true |
|+ |org.apache.spark.sql.catalyst.expressions.Add |true |
+---------------------+-----------------------------------------------------------------------+-----------+
参考:https://blog.csdn.net/pengzonglu7292/article/details/81044857
spark SQL之Catalog API使用的更多相关文章
- Spark SQL 编程API入门系列之Spark SQL支持的API
不多说,直接上干货! Spark SQL支持的API SQL DataFrame(推荐方式,也能执行SQL) Dataset(还在发展) SQL SQL 支持basic SQL syntax/Hive ...
- Spark学习之路(九)—— Spark SQL 之 Structured API
一.创建DataFrame和Dataset 1.1 创建DataFrame Spark中所有功能的入口点是SparkSession,可以使用SparkSession.builder()创建.创建后应用 ...
- Spark 系列(九)—— Spark SQL 之 Structured API
一.创建DataFrame和Dataset 1.1 创建DataFrame Spark 中所有功能的入口点是 SparkSession,可以使用 SparkSession.builder() 创建.创 ...
- Spark记录-org.apache.spark.sql.hive.HiveContext与org.apache.spark.sql.SQLContext包api分析
HiveContext/SQLContext val hiveContext=new HiveContext(new SparkContext(new SparkConf().setAppName(& ...
- 平易近人、兼容并蓄——Spark SQL 1.3.0概览
自2013年3月面世以来,Spark SQL已经成为除Spark Core以外最大的Spark组件.除了接过Shark的接力棒,继续为Spark用户提供高性能的SQL on Hadoop解决方案之外, ...
- 【转载】Spark SQL 1.3.0 DataFrame介绍、使用
http://www.aboutyun.com/forum.php?mod=viewthread&tid=12358&page=1 1.DataFrame是什么?2.如何创建DataF ...
- Spark SQL 编程
Spark SQL的依赖 Spark SQL的入口:SQLContext 官方网站参考 https://spark.apache.org/docs/1.6.2/sql-programming-guid ...
- win7下本地运行spark以及spark.sql.warehouse.dir设置
SparkSession spark = SparkSession .builder() .master("local[*]") .enableHiveSupport() .con ...
- Spark SQL 之自定义删除外部表
前言 Spark SQL 在删除外部表时,本不能删除外部表的数据的.本篇文章主要介绍如何修改Spark SQL 源码实现在删除外部表的时候,可以带额外选项来删除外部表的数据. 本文的环境是我一直使用的 ...
随机推荐
- Ubuntu 14.04 搭建 LNMP
LNMP(Linux-Nginx-MySQL-PHP)这四种软件的组合,可以成为一个免费.高效.扩展性强的网站服务系统. 一.操作步骤 1.安装Nginx sudo apt-get update su ...
- tomcat源码分析一之getCanonicalFile和getAbsolutePath的区别
最近在看tomcat源码 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 2.getAbsolutePath(): 返回绝对路径,但不会处理“.”和“..”的情况 ...
- thinkphp5.1调用七牛云SDK上传文件
thinkphp5.0 class Upload { public static function image(){ if(empty($_FILES['file']['tmp_name'])){ e ...
- fatal error C1189: #error : "No Target Architecture" 解决办法一
在编译程序的时候发现报这个错误,在网上看到很多文章,说设置include路径,lib目录等等,都没有解决.最后调整了以下include文件的顺序,问题解决了.例如 从头文件a.h中截取的一段 type ...
- HIve分组查询返回每组的一条记录
select a.lng,a.lat from (select row_number() over ( partition by uid,grid_id) as rnum,weighted_centr ...
- requests_html爬虫小练习
爬取豆瓣TOP250 from requests_html import HTMLSession #新建一个html文件,将相应的代码放入,运行查看结果,如果页面全部渲染则直接根据页面信息获得数据: ...
- Jquery的Ready方法加载为什么两次?
Ready方法会调用两次? 查看对应的页面是否存在<iframe src="#" --> 存在iframe加载这个页面的时候,页面就会加载两次. $(document) ...
- JavaMail API 发送电子邮件
现在,我们对JavaMail API及其核心类有一个清晰的概念,现在让我们写这将发送简单的电子邮件,邮件带有附件,电子邮件,HTML内容和电子邮件内嵌图像一个简单的程序. 接着在上述所有情况的基本步骤 ...
- 2019秋Java课程总结&实验总结一
1.打印输出所有的"水仙花数",所谓"水仙花数"是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个"水仙花数". 实验源码: ...
- git config配置,工作区和版本库联系。
关于git和github的介绍,我这边不多说. 使用在windows下使用git,需要配置环境变量,也可以使用git自带的终端工具.,打开git bash laoni@DESKTOP-TPPLHIB ...