一、数据的加载和保存
1.1 通用的加载和保存方式
SparkSql提供了通用的保存数据和数据加载的方式,这里的通用指的是使用相同的API,根据不同的参数读取和保存不同格式的数据,SparkSql默认读取和保存的文件格式为parquet
读取数据:
保存数据:
读取json文件:
scala
spark.read.format("json").load("data/user.json")
或者:
scala
spark.read.json("data/user.json")
保存为json文件:
scala
df.write.format("json").save("output1")
我们前面都是使用read API先把文件加载到DataFrame然后再查询,其实,我们也可以直接在文件上进行查询:
文件格式.`文件路径`
例:
加载数据:
保存数据:
保存操作可以使用SaveMode用来指明如何处理数据,使用mode方法来设置,有一点很重要,这些SaveMode都是没有加锁的,也不是原子操作,SaveMode是一个枚举类,其中的常量包括:
Scala/Java | Any Language | Meaning |
---|---|---|
SaveMode.ErrorIfExists(default) | "error"(default) | 如果文件已经存在则抛出异常 |
SaveMode.Append | "append" | 如果文件已经存在则追加 |
SaveMode.Overwrite | "overwrite" | 如果文件已经存在则覆盖 |
SaveMode.Ignore | "ignore" | 如果文件已经存在则忽略 |
Parquet
SparkSql的默认数据源为Parquet格式,Parquet是一种能够有效存储嵌套数据的列式存储格式
数据源为Parquet文件时,SparkSql可以方便的执行所有的操作,不需要使用format,要想修改默认数据源格式,可以通过修改如下配置项:
spark.sql.sources.defautl
Json
SparkSql能够自动推测Json数据集的结构,并将它加载为一个DataSet[Row],可以通过SparkSession.read.json()去加载Json文件
注意:Spark读取的Json文件不是传统的Json文件,每一行都应该是一个Json串
Csv
SparkSql可以配置csv文件的列表信息,读取csv文件,csv文件的第一行设置为数据列
scala
spark.read.format("csv").option("sep",";").option("inferSchema","true").option("header","true").load("data/user.csv")
Mysql
SparkSql可以通过JDBC从关系型数据库中读取数据的方式创建DataFrame,通过对DataFrame一系列的计算后,还可以将数据再写回关系型数据库中,如果使用spark-shell操作,可在启动shell时指定相关的数据库驱动路径或者将数据库驱动放到spark的类路径下
scala
val df: DataFrame = spark.read
.format("jdbc")
.option("url", "jdbc:mysql://master:3306/test")
.option("driver", "com.mysql.jdbc.Driver")
.option("user", "root")
.option("password", "123456")
.option("dbtable", "j1")
.load()
df.write
.format("jdbc")
.option("url", "jdbc:mysql://master:3306/test")
.option("driver", "com.mysql.jdbc.Driver")
.option("user", "root")
.option("password", "123456")
.option("dbtable", "j11")
.save