大數據組件-sparkSQL數據讀取框架,數據寫入框架,讀寫Parquet,json數據格式,sparkSQL:讀寫分區,整合Hive,通過JDBC讀寫mysql數據庫

1.數據讀取框架DataFrameReder

(1)使用場景

  • SparkSQL中專門有一個框架用於讀取外部數據源,叫做DataFrameReder

(2)構成

1.schema

  • 結構信息

2.option

  • 讀取時的參數

3.format

  • 數據源類型

(3)示例

import org.apache.spark.sql.{DataFrame, SparkSession}
import org.junit.Test

class sparkSQLDemo {

  @Test
  def reader1(): Unit = {
    //1.創建sparkSession
    val spark = SparkSession.builder()
      .master("local[6]")
      .appName("dataset2")
      .getOrCreate()//創建對象
      

    //2.有兩種讀取數據源形式
    //2.1 load方式讀取csv文件
    spark.read
      .format("csv")
      .option("header",value = true)
      .option("inferScheme",value = true)//自動進行數據結構推斷
      .load("dataset/BeijingPM20100101_20151231.csv")
      .show()
    
    
    //2.2對上面方式的簡寫
    spark.read
      .option("header",value = true)
      .option("inferScheme",value = true)//自動進行數據結構推斷
      .csv("dataset/BeijingPM20100101_20151231.csv")
      .show()
  }
}

2.數據寫入框架DataFrameWriter

(1)使用場景

  • sparkSQL專門爲寫入數據而創建的框架DataFrameWriter

(2)構成

1.source

  • 寫入目標,文件格式等,通過format設定

2.mode

  • 設置寫入模式,是覆蓋表還是向表中追加,通過mode(SaveMode.xxx)設定

2.1error

  • 將df保存到source時,如果目標已經存在,則報錯

2.2append

  • 將df保存到source時,如果目標已經存在,則添加文件中

2.3overwrite

  • 將df保存到source時,如果目標已經存在,則使用df中數據完全覆蓋目標

2.4ignore

  • df保存到source時,如果目標已經存在,則不會保存df數據

3.extraOptions

  • 外部參數,通過option設定

4.partitiongColumns

  • 分區,通過partitionBy設定

5.bucketColumnNames

  • 分桶,通過bucketBy設定

6.sortColumnNamaes

  • 用於排序的列,通過sortBy設定

(3)示例

import org.apache.spark.sql.SparkSession
import org.junit.Test

class sparkSQLDemo {

  @Test
  def writer1(): Unit = {
    //1.創建sparkSession
    val spark = SparkSession.builder()
      .master("local[6]")
      .appName("dataset2")
      .getOrCreate()//創建對象

    //2.讀取數據集
    val df = spark.read
      .option("head", value = true)
      .csv("dataset/BeijingPM20100101_20151231.csv")

    //3.兩種寫入方式
    //3.1
    df.write.json("dataset/beijing_pm.json")

    //3.2
    df.write.format("json").save("dataset/北京_pm_2222.json")

  }
}

3.讀寫Parquet數據格式

  • Parqute數據格式是爲了保存比較複雜數據,並且保證性能和壓縮率而產生的文件存儲格式

(1)Parquet文件格式使用場景

  1. 數據抽取的時候,存放到hdfs中的時候可能會用到Parquet格式
  2. spark在處理的過程中,也有可能使用Parquet進行暫存

(2)操作Parquet示例

import org.apache.spark.sql.SparkSession
import org.junit.Test

class sparkSQLDemo {

  @Test
  def parquet1(): Unit = {
    //1.創建sparkSession
    val spark = SparkSession.builder()
      .master("local[6]")
      .appName("dataset2")
      .getOrCreate()//創建對象

    //2.讀取數據集
    val df = spark.read
      .option("head", value = true)
      .csv("dataset/BeijingPM20100101_20151231.csv")

    //3.把數據寫爲Parquet格式
    df.write.format("parquet").save("dataset/北京_pm_3")

    //4.讀取Parquet格式文件
    spark.read
      .format("parquet")
      .load("dataset/北京_pm_3")
      .show()

  }
}

4.spark讀寫分區(與Hive分區一致)

(1)分區概念

分區表可以按照某一列作爲分區列,將數據放入不同的文件中,
因爲Hive很重要,spark要經常和hive進行配合,所有spark在設計之初就就規定了要支持分區這種文件夾的讀取

(2)寫文件的時候如何分區

import org.apache.spark.sql.SparkSession
import org.junit.Test

class sparkSQLDemo {

  @Test
  def Partition(): Unit = {
    //1.創建sparkSession
    val spark = SparkSession.builder()
      .master("local[2]")
      .appName("dataset3")
      .getOrCreate()//創建對象

    //2.讀取數據集
    val df = spark.read
      .option("header", value = true)
      .csv("dataset/BeijingPM20100101_20151231.csv")

    //3.寫文件,表分區
    df.write
      .partitionBy("year","month")
      .save("dataset/北京_pm_4")
  }
}

在這裏插入圖片描述

  • 先按照年進行分區,在按照月進行分區

(3)如何讀分區文件

import org.apache.spark.sql.SparkSession
import org.junit.Test

class sparkSQLDemo {

  @Test
  def Partition(): Unit = {
    //1.創建sparkSession
    val spark = SparkSession.builder()
      .master("local[2]")
      .appName("dataset3")
      .getOrCreate()//創建對象


    //2.讀文件,自動發現分區
    //
    spark.read
      .parquet("dataset/beijing_pm4/")
      .printSchema()
  }
}

在這裏插入圖片描述

  • spark讀取分區文件時會自動分區發現

5.saprkSQL讀取JSON

import org.apache.spark.sql.SparkSession
import org.junit.Test

class sparkSQLDemo {

  @Test
  def Json(): Unit = {
    //1.創建sparkSession
    val spark = SparkSession.builder()
      .master("local[2]")
      .appName("dataset3")
      .getOrCreate()//創建對象

    //讀數據
    val df = spark.read
      .option("header", value = true)
      .csv("dataset/BeijingPM20100101_20151231.csv")
    //寫一個json數據文件
    df.write
        .json("dataset/北京pm5.json")
    
    //讀取json文件
    spark.read
      .json("dataset/北京pm5.json")
      .show()
  }
}

5.1Json格式小技巧

(1)toJSON

1.使用場景

toJSON可以將df數據結構轉換爲Json格式
數據處理完了以後,df如果是一個對象,如果其他系統只支持JSON格式數據sparkSQL如果和這種系統進行整合時候,就需要進行數據類型轉換
把DataSet[Object]轉爲DataSet[JsonString]

2.示例

package it.yuge.sql

import org.apache.spark.sql.SparkSession
import org.junit.Test

class sparkSQLDemo {

  @Test
  def Json1(): Unit = {
    //1.創建sparkSession
    val spark = SparkSession.builder()
      .master("local[2]")
      .appName("dataset3")
      .getOrCreate()//創建對象

    //讀數據
    val df = spark.read
      .option("header", value = true)
      .csv("dataset/BeijingPM20100101_20151231.csv")

    /**
      * 使用toJSON的場景:
      * 數據處理完了以後,df如果是一個對象,如果其他系統只支持JSON格式數據
      * sparkSQL如果和這種系統進行整合時候,就需要進行轉換
      */
    df.toJSON.show()
  }
}


(2)可以直接從RDD直接讀取Json的df

1.使用場景

從消息隊列中取出JSON格式數據,需要使用sparkSQL進行處理
把RDD[JsonString]轉爲Dataset[Object]

2.示例

import org.apache.spark.sql.SparkSession
import org.junit.Test

class sparkSQLDemo {

  @Test
  def Json1(): Unit = {
    //1.創建sparkSession
    val spark = SparkSession.builder()
      .master("local[2]")
      .appName("dataset3")
      .getOrCreate()//創建對象

    //讀數據
    val df = spark.read
      .option("header", value = true)
      .csv("dataset/BeijingPM20100101_20151231.csv")

    val jsonrdd = df.toJSON.rdd

    spark.read.json(jsonrdd).show()
  }
}

6.sparkSQL整合Hive

在這裏插入圖片描述
Hive 中主要的組件就三個, HiveServer2 負責接受外部系統的查詢請求, 例如 JDBC, HiveServer2 接收到查詢請求後, 交給 Driver 處理, Driver 會首先去詢問 MetaStore 表在哪存, 後 Driver 程序通過 MR 程序來訪問 HDFS 從而獲取結果返回給查詢請求者

而 Hive 的 MetaStore 對 SparkSQL 的意義非常重大, 如果 SparkSQL 可以直接訪問 Hive 的 MetaStore, 則理論上可以做到和 Hive 一樣的事情, 例如通過 Hive 表查詢數據

(1)開啓 Hive 的 MetaStore 獨立進程

1.修改 hive-site.xml

使用Notepad++連接node02節點對hive配置文件就行修改
在這裏插入圖片描述

2.啓動 Hive MetaStore

nohup /export/servers/hive/bin/hive --service metastore 2>&1 >> /var/log.log &

jps看到RunJar運行說明hive啓動成功

nohub :放在命令開頭,表示不掛起,關閉終端後,仍然運行。
&:放在命令結尾,表示後臺運行,不佔用終端顯示。
2>&1 >>/var/log.log 將–service metastore運行時的2>&1 意思是窗口不輸出內容輸出到/var/log.log日誌文件下

在這裏插入圖片描述

(2) SparkSQL 整合Hive 的 MetaStore

SparkSQL 整合 Hive 的 MetaStore 主要思路就是要通過配置能夠訪問它, 並且能夠使用 HDFS 保存 WareHouse, 這些配置信息一般存在於 Hadoop 和 HDFS 的配置文件中, 所以可以直接拷貝 Hadoop 和 Hive 的配置文件到 Spark 的配置目錄

cd /export/servers/hive/conf
cp hive-site.xml /export/servers/spark/conf/  //hive的site配置文件拷貝到spark的conf目錄下
cd /export/servers/hadoop/etc/hadoop
cp core-site.xml hdfs-site.xml /export/servers/spark/conf/ //和hdfs的配置文件拷貝到spark的conf目錄下

scp -r /export/servers/spark/conf node01:/export/servers/spark/conf
scp -r /export/servers/spark/conf node03:/export/servers/spark/conf

(3)使用 SparkSQL 處理數據並保存進 Hive 表

1.導入 Maven 依賴

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-hive_2.11</artifactId>
    <version>${spark.version}</version>
</dependency>

2. SparkSQL 處理數據並保存進 Hive 表

如果希望使用 SparkSQL 訪問 Hive 的話, 需要做兩件事

  1. 開啓 SparkSession 的 Hive 支持,經過這一步配置, SparkSQL 纔會把 SQL 語句當作 HiveSQL 來進行解析
  2. 設置 WareHouse 的位置雖然 hive-stie.xml 中已經配置了 WareHouse 的位置, 但是在 Spark 2.0.0 後已經廢棄了 hive-site.xml 中設置的 hive.metastore.warehouse.dir, 需要在 SparkSession 中設置 WareHouse 的位置
在這裏插入代碼片

7.sparkSQL讀取JDBC

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