spark SQL(三)数据源 Data Source----通用的数据 加载/保存功能

 Spark SQL 的数据源------通用的数据 加载/保存功能

           Spark SQL支持通过DataFrame接口在各种数据源上进行操作。DataFrame可以使用关系变换进行操作,也可以用来创建临时视图。将DataFrame      注册为临时视图允许您对其数据运行SQL查询。本节介绍使用Spark Data Sources加载和保存数据的一般方法,然后介绍可用于内置数据源的特定选        项。

 1, 常用的加载和保存功能。

     最简单的形式,默认的数据源(parquet除非另有配置 spark.sql.sources.default)将用于所有的操作。

  val usersDF = spark.read.load("examples/src/main/resources/users.parquet")usersDF.select("name", "favorite_color").write.save("namesAndFavColors.parquet")

 2,手动指定选项

      您也可以手动指定将要使用的数据源以及您想要传递给数据源的其他选项。数据源通过其全名指定(即org.apache.spark.sql.parquet),但内置的来源,你也可以使用自己的短名称(json,parquet,jdbc,orc,libsvm,csv,text)。从任何数据源类型加载的数据框可以使用此语法转换为其他类型。

   val peopleDF = spark.read.format("json").load("examples/src/main/resources/people.json")peopleDF.select("name", "age").write.format("parquet").save("namesAndAges.parquet")
3, 直接在文件上运行SQL

       您可以使用SQL直接查询该文件,而不是使用读取API将文件加载到DataFrame中并进行查询。

 val peopleDFCsv = spark.read.format("csv").option("sep", ";").option("inferSchema", "true").option("header", "true").load("examples/src/main/resources/people.csv")val sqlDF = spark.sql("SELECT * FROM parquet.`examples/src/main/resources/users.parquet`")
其中people.csv的数据为:

name;age;job
Jorge;30;Developer
Bob;32;Developer
4,保存模式

    保存操作可以选择一个Save Mode,指定如何处理现有的数据(如果存在)。认识到这些保存模式不使用任何锁定数据而不是原子性的操作数据是很重要的。另外,执行时重写数据,数据在写出新数据之前将被删除。常见类型如下:

Scala/Java     Any LanguageMeaning
SaveMode.ErrorIfExists (default)  "error" (default)     如果数据已经存在,将DataFrame保存到数据源时,则预计会抛出异常。
SaveMode.Append"append"如果data / table已经存在,将DataFrame保存到数据源时,则DataFrame的内容将被添加到现有数据中。
SaveMode.Overwrite"overwrite"覆盖模式意味着将DataFrame保存到数据源时,如果data / table已经存在,则现有数据将被DataFrame的内容覆盖。
SaveMode.Ignore"ignore"                  忽略模式意味着,当将DataFrame保存到数据源时,如果数据已经存在,保存操作将不会保存DataFrame的内容,也不会更改现有数据。这与CREATE TABLE IF NOT EXISTSSQL中的类似。
5,保存数据并持久化表

         DataFrames也可以使用该saveAsTable 命令将其作为持久表保存到Hive Metastore中。请注意,现有的Hive部署对于使用此功能不是必需的。Spark将为您创建一个默认的本地Hive Metastore(使用Derby)。与createOrReplaceTempView命令不同的是, saveAsTable将实现DataFrame的内容并创建指向Hive Metastore中的数据的指针。即使您的Spark程序重新启动后,永久性表格仍然存在,只要您保持与同一Metastore的连接即可。用于持久表的DataFrame可以通过使用表的名称调用tablea方法来创建SparkSession。
        对于基于文件的数据源,例如文本,parquet,json等,您可以通过path选项指定一个自定义表格路径 ,例如df.write.option("path", "/some/path").saveAsTable("t")。当表被删除时,自定义表路径将不会被删除,表数据仍然存在。如果没有指定自定义表格路径,Spark会将数据写入仓库目录下的默认表格路径。当表被删除时,默认的表路径也将被删除。
       从Spark 2.1开始,持久数据源表具有存储在Hive Metastore中的每个分区元数据。这带来了几个好处:
           1) 由于Metastore只能返回查询所需的分区,因此不再需要发现第一个查询的所有分区。
           2) Hive DDL如ALTER TABLE PARTITION ... SET LOCATION现在可用于使用Datasource API创建的表。
请注意,创建外部数据源表(具有path选项的那些表)时,默认情况下不会收集分区信息。要同步Metastore中的分区信息,可以调用MSCK REPAIR TABLE。

6,Bucketing(分段), Sorting(排序) and Partitioning(分区)

     对于基于文件的数据源,也可以对输出进行分类。分段和排序仅适用于持久表:

  peopleDF.write.bucketBy(42, "name").sortBy("age").saveAsTable("people_bucketed")
    而分区则可以同时使用save和saveAsTable使用数据集API。
 usersDF.write.partitionBy("favorite_color").format("parquet").save("namesPartByColor.parquet")

  同时也可以对单个表使用分区和分区:

   peopleDF.write.partitionBy("favorite_color").bucketBy(42, "name").saveAsTable("people_partitioned_bucketed")
partitionBy创建一个目录结构,如“ Partition Discovery 部分所述。因此,对基数高的柱子的适用性有限。相比之下 bucketBy,通过固定数量的桶分配数据,并且可以在大量唯一值无界时使用。

上述完整的例子代码如下:

 private def runBasicDataSourceExample(spark: SparkSession): Unit = {val usersDF = spark.read.load("examples/src/main/resources/users.parquet")usersDF.select("name", "favorite_color").write.save("namesAndFavColors.parquet")val peopleDF = spark.read.format("json").load("examples/src/main/resources/people.json")peopleDF.select("name", "age").write.format("parquet").save("namesAndAges.parquet")val peopleDFCsv = spark.read.format("csv").option("sep", ";").option("inferSchema", "true").option("header", "true").load("examples/src/main/resources/people.csv")val sqlDF = spark.sql("SELECT * FROM parquet.`examples/src/main/resources/users.parquet`")peopleDF.write.bucketBy(42, "name").sortBy("age").saveAsTable("people_bucketed")usersDF.write.partitionBy("favorite_color").format("parquet").save("namesPartByColor.parquet")peopleDF.write.partitionBy("favorite_color").bucketBy(42, "name").saveAsTable("people_partitioned_bucketed")spark.sql("DROP TABLE IF EXISTS people_bucketed")spark.sql("DROP TABLE IF EXISTS people_partitioned_bucketed")}

其中people.json测试数据如下:

{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}





转载于:https://www.cnblogs.com/zhou-jun/p/10195711.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sqlserver日期函数

SQLServer时间日期函数详解,SQLServer,时间日期, 1. 当前系统日期、时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值 例如:向日期加上2天 select dateadd(day,2,2004-10-15) --返回&#xff1a…

荣耀鸿蒙系统开机动画,荣耀赵明:鸿蒙系统首发设备欲屏蔽开机广告

来源:硅谷分析狮余承东表示8月9日会发布鸿蒙系统,而从他透露的一些细节看,鸿蒙系统将首先运用在智慧屏终端上,其配合大屏幕和自研芯片(麒麟AI芯片,鸿鹄智慧显示芯片,凌霄WIFI芯片),将实现生态上…

编写Maven插件的提示

最近,我花了很多时间来编写或为Maven开发插件。 它们简单,有趣且有趣。 我以为我会分享一些技巧,使他们在编写时变得更轻松。 提示1:将任务与Mojo分开 最初,您将把mojo的所有代码放入mojo的类(即&#xf…

oracle通信通道的文件结尾_ORA-03113:通信通道的文件结尾解决

提示ORA-03113:通信通道的文件结尾解决事情原由:oracle安装到win7下,以为都是直接sqlplus / as sysdba,使用数据库,但最近连接时频繁报错,提示ORA-03113:通信通道的文件结尾进程 ID &#xff1a…

Python_迭代器与生成器

迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法:iter()…

JSOI 2009 BZOJ 1444 有趣的游戏

题面 题目描述 小阳阳发明了一个有趣的游戏:有n个玩家,每一个玩家均有一个长度为 l 的字母序列,任何两个玩家的字母序列不同。共有m种不同的字母,所有的字母序列都由这m种字母构成,为了方便,我们取大写字母…

html语言dl与ul,HTML中DL、UL、OL用哪个比较好

大家好~ 我是一枚正直纯洁的苦逼程序员!!!!!ul,ol,dl标签是CSS网页布局中常用的列表元素。 列表将具有相似特征或先后顺序的内容按照从上到下的顺序排列起来。1.ul标签:无序列表始于…

slot多作用域 vue_详解Vue.js 作用域、slot用法(单个slot、具名slot)

作用域HEi免费资源网在介绍slot前&#xff0c;需要先知道一个概念&#xff1a;编译的作用域。比如父组件中有如下模板&#xff1a;HEi免费资源网{{message}}这里的message就是一个slot&#xff0c;但是它绑定的是父组件的数据&#xff0c;而不是组件< child-component >的…

Java – JDK 8的远景

世界正在缓慢但肯定地发生变化。 经过更改后&#xff0c;Java有了JDK 7的全新外观&#xff0c;Java社区期待JDK 8&#xff08;可能还有JDK 9&#xff09;所带来的其余改进。 JDK 8的目标目的是填补JDK 7实施中的空白-该实施中剩下的部分难题&#xff0c;应该在2013年底之前为广…

CSS 学习路线(一)元素

元素(element) 类型:替换和非替换元素 替换元素(replaced element): 用来替换元素内容的部分并非由文档内容直接显示. eg:img input 非替换元素(nonreplaced element): 其内容由用户代理在元素本身生成的框显示. eg:绝大多数都是非替换元素 基本元素类型:块级(block-lev…

[urllib]urlretrieve在python3

python3下面要使用&#xff1a;urllib.request.urlretrieve()这种形式的调用 1 from urllib.request import urlretrieve 2 3 4 urlretrieve(url, path) 转载于:https://www.cnblogs.com/sigai/p/8178375.html

使用Gulp压缩CSS/JS

一、安装 1.安装gulp npm install -g gulp2.检查gulp 版本 gulp -v3.在项目文件夹下安装gulp npm install --save-dev gulp二、压缩JS 1.安装gulp-uglify模块 npm install gulp-uglify2.在项目根目录创建gulpfile.js文件 3.在gulpfile.js文件中写入代码 // 获取 gulpvar gulp …

android活动开始,android – 点击谷歌地图标记infoWindow开始活动

我建议使用HashMap或类似的东西.当您遍历对象列表并为它们创建标记时,还要将标记添加到列表中,使用对象的ID作为键,将标记作为值&#xff1a;private HashMap markerMap new HashMap();…for(MarkerObject obj : this.markerObjects){//If the marker isnt already being disp…

Hamcrest包含匹配器

与Hamcrest 1.2相比 &#xff0c;针对Matchers类的Hamcrest 1.3 Javadoc文档为该类的几种方法添加了更多文档。 例如&#xff0c;四个重载的contains方法具有更具描述性的Javadoc文档&#xff0c;如下面所示的两个比较屏幕快照所示。 尽管仅通过尝试就可以弄清楚“包含”匹配器…

华为cor—al10_cor al10是华为什么型号 cor al10是华为啥型号

cor al10是华为荣耀Play。外观方面&#xff0c;荣耀Play提供有星云紫&#xff0c;极光蓝&#xff0c;幻夜黑三种基础配色&#xff0c;以及幻夜黑与魅焰红的酷玩版配色&#xff1b;拍照方面&#xff0c;荣耀Play具有1600万AI双摄像头&#xff0c;前置摄像头为1600万像素&#xf…

函数 (四) 迭代器和生成器

一 迭代器 一 迭代的概念 #迭代器即迭代的工具&#xff0c;那什么是迭代呢&#xff1f;#迭代是一个重复的过程&#xff0c;每次重复即一次迭代&#xff0c;并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复&#xff0c;因而不是迭代print(>) l[1,2,3]…

进阶-JMS 知识梳理

JMS 一、 概述与介绍 ActiveMQ 是Apache出品&#xff0c;最流行的、功能强大的即时通讯和集成模式的开源服务器。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。提供客户端支持跨语言和协议&#xff0c;带有易于在充分支持JMS 1.1和1.4使用J2EE企业集成模式…

android蓝牙pair,Android向更多蓝牙设备开放Fast Pair功能 配对更轻松了

原标题&#xff1a;Android向更多蓝牙设备开放Fast Pair功能 配对更轻松了 来源&#xff1a;cnBeta.COM蓝牙是一项应用非常广泛的无线技术&#xff0c;在无线音频配件、智能手表和智能家电中都广泛使用。不过蓝牙设备的配对体验并不优秀&#xff0c;而且无法实现跨平台的一致性…

用CSS让DIV上下左右居中的方法

例如 一个父div(w:100%;h:400px)中有一个子div(w:100px;100px;)。让其上下左右居中。 方法一&#xff08;varticle-align&#xff09; 理念 利用表格单元格的居中属性。 步骤 父div外层配置一个div&#xff0c;同时设置为表格元素 (display: table)&#xff0c;宽度为100%父…

功能性Java集合

如今&#xff0c;在功能上大肆宣传&#xff0c;因此至少在Java集合方面&#xff0c;我将简要介绍一下其中的功能。 我个人喜欢标准 集合API&#xff0c;但在某些情况下可能会很尴尬并添加其他详细信息。 在Java 8的更高版本中&#xff0c;这应该不是问题。 在那里&#xff0c;…