定义
Spark SQL
可以通过DataFream
接口操作各种数据源。可以通过关系转换或者临时表来操作DataFrame
。这里我们将介绍通用的数据源加载方法和数据保存方法。
通用加载/保存方法
Spark
默认的数据源格式为Parquet
格式,数据源格式问Parquet
文件的时候,Spark
读取数据的时候不需要指定具体的格式,如果想要修改默认的数据格式,就需要修改spark.sql.sources.default
参数
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder().appName("DataFrameTest").master("local[2]").getOrCreate()
//因为Parquet格式的文件时Spark加载数据的默认格式,所以不需要指定format格式
val personDF: DataFrame = spark.read.load("hdfs://xxxxx:8020/testfile/person.parquet")
personDF.show()
}
如果我们输入的数据文件格式不是Parquet
,那么我们就需要手动指定读取的数据源格式。数据源格式需要指定全名(org.apache.spark.sql.parquet)
,如果手动指定的数据源格式为spark内置格式,只需要指定简称,如json、parquet、jdbc、text、orc、libsvm、csv
。
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder().appName("DataFrameTest").master("local[2]").getOrCreate()
//从本地读取json格式的数据,因为json不是spark默认的数据源格式,所以需要手动指定数据源格式为json
val personDF: DataFrame = spark.read.format("json").load("C:\\Users\\39402\\Desktop\\person.json")
//利用Dataframe的write和save方法将本地读取到的数据以parquet的格式写到HDFS上,
personDF.write.format("parquet").save("hdfs://xxxxx:8020/testfile/person.parquet")
}
除此之外我们也可以把SQL
执行在数据源文件上,下边就是一个例子,它将SQL
运行在文件上。
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder().appName("DataFrameTest").master("local[2]").getOrCreate()
//将SQL执行在数据源的文件上,一定要注意书写格式
spark.sql("select * from parquet.`hdfs://xxxxx:8020/testfile/person.parquet`").show()
}
文件保存选项
当我们的SparkSQL
处理完数据以后,需要向本地或者文件系统保存数据,我们可以利用SaveModel
指定保存策略,,例如文件已经存在就抛异常、覆盖原数据等。
代码例子
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder().appName("DataFrameTest").master("local[2]").getOrCreate()
//从本地读取json格式的数据,因为json不是spark默认的数据源格式,所以需要手动指定数据源格式为json
val personDF: DataFrame = spark.read.format("json").load("C:\\Users\\39402\\Desktop\\person.json")
//指定SaveModel策略为如果文件已存在就抛异常
personDF.write.mode(SaveMode.ErrorIfExists).save("hdfs://xxxx:8020/testfile/person.parquet")
}
SaveModel
保存策略表
Scala/Java | Meaning |
---|---|
SaveMode.ErrorIfExists (default) | 如果数据已经存在,将DataFrame保存到数据源时,则预计会抛出异常。 |
SaveMode.Append | 如果data / table已经存在,将DataFrame保存到数据源时,则DataFrame的内容将被添加到现有数据中。 |
SaveMode.Overwrite | 覆盖模式意味着将DataFrame保存到数据源时,如果data / table已经存在,则现有数据将被DataFrame的内容覆盖。 |
SaveMode.Ignore | 忽略模式意味着,当将DataFrame保存到数据源时,如果数据已经存在,保存操作将不会保存DataFrame的内容,也不会更改现有数据。这与CREATE TABLE IF NOT EXISTSSQL中的类似。 |
Parquet文件
Parquet
是一种列式存储格