寫在前面: 博主是一名軟件工程系大數據應用開發專業大二的學生,暱稱來源於《愛麗絲夢遊仙境》中的Alice和自己的暱稱。作爲一名互聯網小白,
寫博客一方面是爲了記錄自己的學習歷程,一方面是希望能夠幫助到很多和自己一樣處於起步階段的萌新
。由於水平有限,博客中難免會有一些錯誤,有紕漏之處懇請各位大佬不吝賜教!個人小站:http://alices.ibilibili.xyz/ , 博客主頁:https://alice.blog.csdn.net/
儘管當前水平可能不及各位大佬,但我還是希望自己能夠做得更好,因爲一天的生活就是一生的縮影
。我希望在最美的年華,做最好的自己!
學了一段時間的SparkSQL,相信大家都已經知道了SparkSQL是一個相當強大的存在,它在一個項目的架構中扮演着離線數據處理的"角色",相較於前面學過的HQL,SparkSQL能明顯提高數據的處理效率。正因爲如此,SparkSQL就會涉及到與多種的數據源進行一個交互的過程。那到底是如何交互的呢,下文或許能給你帶來答案…
碼字不易,先贊後看,養成習慣!
Spark SQL可以與多種數據源進行交互,如普通文本、json、parquet、csv、MySQL等
下面將從寫數據和讀數據兩個角度來進行演示。
準備數據
以下面的演示爲例,我們在本地的D:\data目錄下創建一個person.txt
19 zhhshang 66
20 lisi 66
19 wangwu 77
31 zhaoliu 66
19 maqi 88
並在本地Mysql創建一個數據庫spark_test,並創建一個表名persons,並且表結構如下所示:
寫入數據
object WriterDataSourceDemo {
case class Person(id:Int,name:String,age:Int)
def main(args: Array[String]): Unit = {
//1.創建SparkSession
val spark: SparkSession = SparkSession.builder().master("local[*]").appName("SparkSQL")
.getOrCreate()
val sc: SparkContext = spark.sparkContext
sc.setLogLevel("WARN")
//2.讀取文件
val fileRDD: RDD[String] = sc.textFile("D:\\data\\person.txt")
val linesRDD: RDD[Array[String]] = fileRDD.map(_.split(" "))
val rowRDD: RDD[Person] = linesRDD.map(line =>Person(line(0).toInt,line(1),line(2).toInt))
//3.將RDD轉成DF
//注意:RDD中原本沒有toDF方法,新版本中要給它增加一個方法,可以使用隱式轉換
import spark.implicits._
//注意:上面的rowRDD的泛型是Person,裏面包含了Schema信息
//所以SparkSQL可以通過反射自動獲取到並添加給DF
val personDF: DataFrame = rowRDD.toDF
//==================將DF寫入到不同數據源===================
//Text data source supports only a single column, and you have 3 columns.;
//personDF.write.text("D:\\data\\output\\text")
personDF.write.json("D:\\data\\output\\json")
personDF.write.csv("D:\\data\\output\\csv")
personDF.write.parquet("D:\\data\\output\\parquet")
val prop = new Properties()
prop.setProperty("user","root")
prop.setProperty("password","root")
// 將數據寫入到數據庫
personDF.write.mode(SaveMode.Overwrite).jdbc(
"jdbc:mysql://localhost:3306/spark_test?characterEncoding=UTF-8","persons",prop)
println("寫入成功")
sc.stop()
spark.stop()
}
}
運行結果:
我們在程序中設置的輸出路徑下看到了已經生成的三個文件
csv目錄
json目錄
parquet目錄
再讓我們打開數據庫看看
發現我們新建的數據庫中的數據也添加了進來
說明我們的數據寫入成功了,感興趣的朋友們可以自己試一下喲~
下面我們再來嘗試把數據從我們寫入的數據文件中讀取出來。
讀數據
object ReadDataSourceDemo {
def main(args: Array[String]): Unit = {
//1.創建SparkSession
val spark: SparkSession = SparkSession.builder().master("local[*]").appName("SparkSQL")
.getOrCreate()
val sc: SparkContext = spark.sparkContext
sc.setLogLevel("WARN")
//2.讀取文件
spark.read.json("D:\\data\\output\\json").show()
spark.read.csv("D:\\data\\output\\csv").toDF("id","name","age").show()
spark.read.parquet("D:\\data\\output\\parquet").show()
val prop = new Properties()
prop.setProperty("user","root")
prop.setProperty("password","root")
spark.read.jdbc(
"jdbc:mysql://localhost:3306/spark_test?characterEncoding=UTF-8","persons",prop).show()
sc.stop()
spark.stop()
}
}
運行結果
看到上圖的結果說明我們成功實現了將數據導出,再讀取的過程。
總結
-
SparkSQL 寫數據:
DataFrame/DataSet.write.json/csv/jdbc -
SparkSQL讀數據
SparkSession.read.json/csv/text/jdbc/format
結語
本次的分享就到這裏,受益的朋友或對大數據技術感興趣的夥伴可以點個贊關注一下博主,後續會持續更新大數據的相關內容,敬請期待(✪ω✪)