Spark-SQL的Java实践案例(四)
数据源:(读取与存储数据,JDBC服务器)
史上最简单的spark教程
所有代码示例地址:https://github.com/Mydreamandreality/sparkResearch
(提前声明:文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章,写作不易,转载请注明)
(文章参考:Elasticsearch权威指南,Spark快速大数据分析文档,Elasticsearch官方文档,实际项目中的应用场景)
(帮到到您请点点关注,文章持续更新中!)
Git主页 https://github.com/Mydreamandreality
在这里我们继续上一章节SparkSQL的案例啊,没有看上一章节的兄弟萌 点击这里哈https://blog.csdn.net/youbitch1/article/details/88852644
这章我们来搞 数据源:(读取与存储数据,JDBC服务器)
- sparkSQL支持很多种结构化的数据源,并且把内部复杂的细节都封装了起来,方便我们从各种数据源轻松的获取Row对象
- 数据源包括但不限:parquet,hive表,JSON等等
- 而且当我们使用SQL查询数据源中的数据,并且只用到了一部分字段的时候,sparkSQL可以很智能的只扫描我们用到的这些字段
- 当然除了数据源我们还可以把RDD转换成dataframe,就是我们上面的例子,然后执行SQL查询,贼简单
代码案例:
parquet
- parquet是一种强大的列式存储格式,它可以高效的存储嵌套格式的字段,SparkSQL提供了直接读取存储parquet格式文件的方法
- 代码案例:
SparkSession sparkSession = SparkSession.builder()
.master("local")
.appName("spark app")
.getOrCreate();
Dataset<Row> rddDataset = sparkSession.read().parquet("usr/local/data.parquet");
rddDataset.select("name","age").write().save("nameAndAge.parquet");
JSON
- JSON是一种半结构化/结构化的存储格式,如果兄弟萌的数据格式符合json的定义,那么sparkSQL就可以扫描j文件推测出结构信息,并且可以使我们通过名称访问字段
- 代码案例:
Dataset<Row> jsonDataSet = sparkSession.read().json("usr/local/data.json");
jsonDataSet.select("name","age").write().save("nameAndAge.parquet");
{
"name": "Sparky The Bear",
"lovesPandas":true,
"knows": {"friends":["holden"]}
}
那么扫描解析后就是这个样子 ↓
root
|-- knows: struct (nullable = true)
| |-- friends: array (nullable = true)
| | |-- element: string (containsNull = false)
|-- lovesPandas: boolean (nullable = true)
|-- name: string (nullable = true)
手动指定数据源选项:
- 可以看到,我们刚才读取指定的数据源都是通过内置的源函数
- 比如 spark.read().json() 或者.parquet() 等
- 我们还可以手动指定任何你想传递的数据源类型
- 代码案例:
//手动指定数据源
Dataset<Row> customDataSource = sparkSession.read().format("json").load("usr/local/data.json");
customDataSource.select("name","age").write().format("json").save("nameAndAge.json");
保存模式
- 说了这么久了,兄弟萌,我们的数据保存模式是怎么样我们还不知道
- 保存模式抽象点说就是我们的想怎么样保存数据,追加还是覆盖还是其他的方式
Java函数 | 模式 | 详解 |
---|---|---|
SaveMode.ErrorIFExists(default) | “error”(default) | 将DataFrame保存到(数据源)时,.如果数据已经存在,则抛出异常. |
SaveMode.Append | “append” | 如果数据存在,则追加 |
SaveMode.Overwrite | “overwrite” | 如果数据存在则覆盖 |
SaveMode.Ignore | “ignore” | 如果数据存在,则忽略,不影响原先数据,也不会保存现在的数据 |
代码案例:
customDataSource.select("name","age").write().format("json").
mode(SaveMode.Append).save("nameAndAge.json");
未完待续兄弟萌