SparkSQL如何實現多數據源交互?這篇博客或許能告訴你答案!

寫在前面: 博主是一名軟件工程系大數據應用開發專業大二的學生,暱稱來源於《愛麗絲夢遊仙境》中的Alice和自己的暱稱。作爲一名互聯網小白,寫博客一方面是爲了記錄自己的學習歷程,一方面是希望能夠幫助到很多和自己一樣處於起步階段的萌新。由於水平有限,博客中難免會有一些錯誤,有紕漏之處懇請各位大佬不吝賜教!個人小站:http://alices.ibilibili.xyz/ , 博客主頁:https://alice.blog.csdn.net/
儘管當前水平可能不及各位大佬,但我還是希望自己能夠做得更好,因爲一天的生活就是一生的縮影。我希望在最美的年華,做最好的自己!

        學了一段時間的SparkSQL,相信大家都已經知道了SparkSQL是一個相當強大的存在,它在一個項目的架構中扮演着離線數據處理的"角色",相較於前面學過的HQL,SparkSQL能明顯提高數據的處理效率。正因爲如此,SparkSQL就會涉及到與多種的數據源進行一個交互的過程。那到底是如何交互的呢,下文或許能給你帶來答案…

        碼字不易,先贊後看,養成習慣!
在這裏插入圖片描述


        Spark SQL可以與多種數據源進行交互,如普通文本jsonparquetcsvMySQL

        下面將從寫數據和讀數據兩個角度來進行演示。

準備數據

        以下面的演示爲例,我們在本地的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()
  }
}

運行結果
在這裏插入圖片描述
看到上圖的結果說明我們成功實現了將數據導出,再讀取的過程。

總結

  1. SparkSQL 寫數據:
    DataFrame/DataSet.write.json/csv/jdbc

  2. SparkSQL讀數據
    SparkSession.read.json/csv/text/jdbc/format

結語

        本次的分享就到這裏,受益的朋友或對大數據技術感興趣的夥伴可以點個贊關注一下博主,後續會持續更新大數據的相關內容,敬請期待(✪ω✪)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章