概述
从Spark 1.2版本开始,Spark SQL正式支持外部数据源。它可以通过DataFrame接口对各种数据源进行操作,例如orc,parquet,json,hive,jdbc,avro等。它既可以通过转换成RDD进行操作,也可以被创建为一个临时视图。将外部数据读入后创建为一个临时视图,可以用sql的方式进行查询处理。这个特性可以很方便让我们直接可以用Spark SQL操作各种格式的数据,而且可以轻松的将它们进行互相转换。下面将介绍Spark SQL加载和保存外部数据源的一般方法。
测试JSON
这里有一个people.json文件,这里用到的数据为spark官方提供的测试数据,在spark包的examples目录下。
[hadoop@hadoop001 resources]$ cat people.json
{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}
接下来用Spark SQL的外部数据源的方式将数据加载为DataFrame。这里用的是一种通用的方式进行加载。format里面传入的是将要处理的文件的格式。load传入的是文件的路径。
object ExternalDataSourceAPP {
def main(args: Array[String]): Unit = {
val sparkSession = SparkSession.builder().appName("ExternalDataSourceAPP")
.master("local[2]")
.getOrCreate()
/**
* 通用
*/
// 读
val jsonDF = sparkSession.read.format("json").load("file:\\F:\\sparktestdata\\resources\\people.json")
jsonDF.show()
sparkSession.stop()
}
}
-------------------输出结果--------------------
+----+-------+
| age| name|
+----+-------+
|null|Michael|
| 30| Andy|
| 19| Justin|
+----+-------+
还有一种简写的方式进行加载,read之后直接.+你要处理的数据格式,里面传入path即可。例如处理json格式如下。其它的还有scv,text,jdbc,orc,parquet,table(hive)等。
val jsonDF = sparkSession.read.json("file:\\F:\\sparktestdata\\resources\\people.json")
jsonDF.show()
Spark SQL外部数据源不仅可以读,还可以写。我们将上面的jsonDF写入一个json文件。注意,这里写入只能指定到文件夹,不能指定到文件。mode是写入的方式,传入的参数有overwrite,append,ignore,error。
jsonDF.write.format("json").mode("overwrite").save("file:\\F:\\sparktestdata\\resources\\peopleCopy.json")
这里我们可以将读入的json格式存储为其它格式的数据,例如存储为orc。我们可以发现,利用外部数据源我们可以很方便的转换数据格式。
jsonDF.write.format("orc").mode("overwrite").save("file:\\F:\\sparktestdata\\resources\\peopleCopy.json")
我们还可以直接将jsonDF存储到hive表中
jsonDF.write.saveAsTable("person")