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文件格式使用場景
- 數據抽取的時候,存放到hdfs中的時候可能會用到Parquet格式
- 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 的話, 需要做兩件事
- 開啓 SparkSession 的 Hive 支持,經過這一步配置, SparkSQL 纔會把 SQL 語句當作 HiveSQL 來進行解析
- 設置 WareHouse 的位置雖然 hive-stie.xml 中已經配置了 WareHouse 的位置, 但是在 Spark 2.0.0 後已經廢棄了 hive-site.xml 中設置的 hive.metastore.warehouse.dir, 需要在 SparkSession 中設置 WareHouse 的位置
在這裏插入代碼片
7.sparkSQL讀取JDBC
略