Spark SQL(五)之数据加载与存储
一、数据加载
(1)默认数据源(parquet)
最简单加载数据的方式,所有操作都使用默认数据源(parquet
)。如果指定默认数据源需要配置 spark.sql.sources.default参数。
Dataset<Row> manDF = spark.read().load("hdfs://master:9000/test.parquet");
manDF.select("name", "desc").write().save("hdfs://master:9000/test1.parquet");
(2)手动指定选项
可以手动指定将要使用的数据源以及要传递给数据源的任何其他选项。数据源通过其全名指定(即org.apache.spark.sql.parquet
),但内置的来源。
也可以使用自己的短名称(json
,parquet
,jdbc
,orc
,libsvm
,csv
,text
)。从任何数据源类型加载的DataFrame都可以使用此语法转换为其他类型。
请参阅API文档以获取内置源的可用选项,例如 org.apache.spark.sql.DataFrameReader
和org.apache.spark.sql.DataFrameWriter
。此处记录的选项也应通过非Scala Spark API(例如PySpark)应用。
Dataset<Row> manDF = spark.read().format("json").load("hdfs://master:9000/test.json");
manDF.select("name", "desc").write().format("parquet").save("hdfs://master:9000/test1.parquet");
(3)加载CSV文件
Dataset<Row> manDF = spark.read().format("csv").option("sep", ";").option("inferSchema", "true").option("header", "true").load("hdfs://master:9000/test.csv");
(4)写操作期使用额外的option
控制ORC数据源的Bloom过滤器和字典编码,以下ORC示例将创建Bloom过滤器,并仅将字典编码用于age
。对于parquet
,也存在parquet.enable.dictionary
。要查找有关其他ORC / Parquet选项的更多详细信息,请访问Apache ORC / Parquet官方网站。
manDF.write.format("orc").option("orc.bloom.filter.columns", "age").option("orc.dictionary.key.threshold", "1.0").option("orc.column.encoding.direct", "name").save("hdfs://master:9000/man.orc")
二、保存模式
保存操作可以选择带SaveMode
,指定如何处理现有数据(如果存在)。重要的是要认识到这些保存模式不使用任何锁定,也不是原子的。另外,执行时Overwrite
,将在写出新数据之前删除数据。
Scala / Java | 任何语言 | 意义 |
---|---|---|
SaveMode.ErrorIfExists (默认)
|
"error" or "errorifexists" (默认)
|
将DataFrame保存到数据源时,如果已经存在数据,则将引发异常。 |
SaveMode.Append
|
"append"
|
将DataFrame保存到数据源时,如果已经存在数据/表,则应该将DataFrame的内容附加到现有数据中。 |
SaveMode.Overwrite
|
"overwrite"
|
覆盖模式意味着将DataFrame保存到数据源时,如果已经存在数据/表,则预期现有数据将被DataFrame的内容覆盖。 |
SaveMode.Ignore
|
"ignore"
|
忽略模式意味着在将DataFrame保存到数据源时,如果已经存在数据,则期望保存操作不保存DataFrame的内容并且不更改现有数据。这类似于CREATE TABLE IF NOT EXISTS SQL中的。
|
保存到永久表
DataFrames
也可以使用以下saveAsTable
命令作为持久性表保存到Hive Metastore中。请注意,使用此功能不需要现有的Hive部署。Spark将为您创建一个默认的本地Hive Metastore(使用Derby)。与createOrReplaceTempView
命令不同, saveAsTable
它将具体化DataFrame的内容并在Hive元存储中创建一个指向数据的指针。即使您重新启动Spark程序,持久表仍将存在,只要您保持与同一metastore的连接即可。可以通过使用表名称table
在上调用方法来创建持久表的DataFrame SparkSession
。
对于基于文件的数据源,例如文本,镶木地板,json等,您可以通过path
选项指定自定义表路径 ,例如df.write.option("path", "/some/path").saveAsTable("t")
。删除表后,自定义表路径将不会删除,并且表数据仍然存在。如果未指定自定义表路径,Spark会将数据写入仓库目录下的默认表路径。删除表时,默认表路径也将被删除。
从Spark 2.1开始,持久数据源表在Hive元存储中存储了按分区的元数据。这带来了几个好处:
- 由于元存储只能返回查询的必要分区,因此不再需要在第一个查询中将所有分区发现到表中。
- Hive DDL(例如,
ALTER TABLE PARTITION ... SET LOCATION
现在可用于使用Datasource API创建的表)。
请注意,在创建外部数据源表(带有path
选项的表)时,默认情况下不会收集分区信息。要同步元存储中的分区信息,可以调用MSCK REPAIR TABLE
。
三、分组,分类和分区
对于基于文件的数据源,也可以对输出进行存储和分类或分区。
(1)桶和排序
存储桶和排序仅适用于持久表
cityDF.write().bucketBy(10, "city").sortBy("area").saveAsTable("city_buckets");
(2)分区
而分区可以既使用save
和saveAsTable
使用DataSet API时
manDF.write().partitionBy("age").format("json").save("hdfs://master:9000/man.json");
(3)分区和桶
对表使用分区和存储桶
manDF.write().partitionBy("age").bucketBy(18, "name").saveAsTable("man_partition_buckets")
partitionBy创建一个分区结构描述“分区发现”部分,它对具有高聚集数的列适用性有限。相反, bucketBy将数据分布在固定数量的存储桶中,在唯一值的数量不受限制时可以使用。
Spark SQL(五)之数据加载与存储相关推荐
- Python之pandas数据加载、存储
Python之pandas数据加载.存储 0. 输入与输出大致可分为三类: 0.1 读取文本文件和其他更好效的磁盘存储格式 2.2 使用数据库中的数据 0.3 利用Web API操作网络资源 1. 读 ...
- 《利用Python进行数据分析·第2版》第6章 数据加载、存储与文件格式
第1章 准备工作 第2章 Python语法基础,IPython和Jupyter 第3章 Python的数据结构.函数和文件 第4章 NumPy基础:数组和矢量计算 第5章 pandas入门 第6章 数 ...
- pandas入门(6)——数据加载、存储与文件格式
pandas入门(6)--数据加载.存储与文件格式 输入输出通常可以划分为几个大类:读取文本文件和其他更高效的磁盘存储格式,加载数据库中的数据,利用Web API操作网络资源 一.读取文本格式数据 函 ...
- 利用Python进行数据分析(四):数据加载、存储与文件格式
标题利用Python进行数据分析(四):数据加载.存储与文件格式 学习笔记来源于:简书https://www.jianshu.com/p/047d8c1c7e14 输入输出通常可以划分为几个大类:读取 ...
- 《利用python进行数据分析》——第6章 数据加载、存储与文件格式——读书笔记
第6章 数据加载.存储与文件格式 6.1 读写文本格式的数据 pandas提供了一些用于将表格型数据读取为DataFrame对象的函数. 其中read_csv和read_talbe用得最多 panda ...
- python数据分析实例_python数据分析实例3-商铺数据加载及存储
商铺数据加载及存储 在data文件夹存放有商铺数据.csv文件,路径:path = '../data/商铺数据.csv' 要求: 1.成功读取"商铺数据.csv"文件,并展示打印出 ...
- pandas数据加载与存储
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.pandas是什么? 二.数据加载与存储 1.引入库 2.读入数据 2.1 读取Excel文件 2.2 读取 tx ...
- 【数据分析项目实战】商铺数据加载及存储
''' [项目] 商铺数据加载及存储要求: 1.成功读取"商铺数据.csv"文件 2.解析数据,存成列表字典格式:[{'var1':value1,'var2':value2,'va ...
- 第六篇 数据加载、存储与⽂件格式
输⼊输出通常可以划分为⼏个⼤类:读取⽂本⽂件和其他更⾼效的磁盘存储格式,加载数据库中的数据,利⽤Web API操作⽹络资源. 一.读写文本格式的数据 pandas提供了⼀些⽤于将表格型数据读取为Dat ...
最新文章
- PVD与CVD性能比较
- 写一个图片预览器(react-native),温习一下初中数学
- SqlDataSource 執行資料篩選
- C++ 接口(抽象类)的概念
- Android—TableLayout自定义表格
- 23种设计模式C++源码与UML实现--访问者模式
- 【转载】Spring @Async 源码解读。
- java getrealpath_JavaEE路径陷阱之getRealPath
- 解决 avformat_alloc_context无法识别的问题
- 解决在Android Studio 3.2找不到Android Device Monitor工具
- 我的第一个MPI程序:利用矩形规则计算pi
- 郁金香商业辅助教程 2016 笔记 11~15
- 一加8 Pro或将配备120Hz刷新率屏幕
- Django Ajax文件下载
- springboot整合mybatis错误 Invalid bound statement (not found): 解决办法
- PowerBI-筛选器函数-KEEPFILTERS
- U盘故障恢复--“文件或目录损坏且无法读取”
- Vim插件之python-mode
- 微信小程序 语音录制功能和文件(ppt、word、excel、pdf、txt格式)上传
- 移动通信基础(14)均衡
热门文章
- vue 前端设置允许跨域_web 前端的一些小问题
- 2023届春招实习拉钩一面凉经
- leetcode53. 最大子数组和(动态规划)
- leetcode:203. 移除链表元素(两种方法)
- [数据结构]对称矩阵和三角矩阵压缩公式
- [蓝桥杯][基础练习VIP]Huffuman树
- 哈工大威海计算机组成原理,哈工大威海计算机组成原理复习.pdf
- php抓取多个网页合并,PHP 使用 CURL 同步抓取多个网页
- Redis流量控制策略
- linux strcpy函数实现,strcpy(char *dest , char *src)的漏洞