前言
Spark是基于Hadoop生态圈二次构建的,它支持多种输入输出源,spark可以通过Hadoop MapReduce 所使用的InputFormat 和 OutPutFormat 接口访问数据,而大部分常见的文件格式与存储系统(S3, HDFS, Cassandra, HBase 等)都支持这种接口。
数据读取与存储在spark 2.x之前是通过sqlContext/hiveContext进行读取和写入的,在spark 2.0以后可以使用SparkSession成员变量read来获取相应的DataFrameReader进行读取外界数据源,以及dataset的write成员变量来获取DataFrameWriter,进行数据的写入操作。
概述
DataFrameReader读取数据,数据源可以选择json/parquet/text/orc/csv等,一般情况下都有两种方法去读取:
// 指定format shcema option和路径
sparkSession.read.
format("json/parquet/text/orc/csv").
schema(xx).
option("", xx).
load(path*)
// 利用不同的类型的特定方法
sparkSession.read.
json(path*)/csv(path*)/parquet(path*)/
orc(path*)/text(path*)/textFile(path*)
// jdbc单独
DataFrameWriter用来写入数据,写入方式可以选择json/parquet/text/orc/csv等,一般情况下都有两种方法去写入:
// 获取方式
dataset/dataframe.write
def write: DataFrameWriter[T]
// 写入文件
// Mode: SaveMode.Overwrite/SaveMode.Append/SaveMode.Ignore/SaveMode.ErrorIfExists
// Modestring: overwrite/append/ignore/error<errorifexists>
ds.write.
format("json/parquet/text/orc/csv").
mode("").
option(xx, xx).
save(path)
ds.write.
mode("").
json(path)/csv(path)/parquet(path)/
orc(path)/text(path)/textFile(path)
// 写入表中:saveAsTable会根据column名字查找正确的列位置,
// insertInto会忽略位置,按照dataFrame的定义顺序插入
def insertInto(tableName: String)
def saveAsTable(tableName: String)
// jdbc单独
json
读取json文件,DataFrameReader会自动推断schema,先遍历一遍数据集,抽取出schema,然后进行每行解析,所以对于各行如果存在模式不统一的情况,有的缺少某个字段,spark也会进行处理,相应的column设置为None, 读取后得到DataFrame,每一行schema为json的推断字段&类型,array里面嵌套的jsonObj会被解析为struct。
// 数据
{
"name":"Michael"}
{
"name":"Andy",