Spark-SQL的Java实践案例(四)
数据源:(读取与存储数据,JDBC服务器)


这章我们来搞 数据源:(读取与存储数据,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");