Spark SQL

簡介

Spark SQL是Spark用來處理結(jié)構(gòu)化數(shù)據(jù)的一個(gè)模塊,它提供了一個(gè)編程抽象叫做DataFrame(底層也是RDD)并且作為分布式SQL查詢引擎的作用。

引入

Hive SQL轉(zhuǎn)換成MapReduce然后提交到集群上執(zhí)行,大大簡化了編寫MapReduce的程序的復(fù)雜性,由于MapReduce這種計(jì)算模型執(zhí)行效率比較慢。所有Spark SQL的應(yīng)運(yùn)而生,它是將Spark SQL轉(zhuǎn)換成特殊的RDD(DataFrame),然后提交到集群執(zhí)行,執(zhí)行效率非常快!



數(shù)據(jù)分析的2種方式:

①:命令式:操作面向過程和算法性的處理,(可以解決非結(jié)構(gòu)化數(shù)據(jù))

②:SQL擅長數(shù)據(jù)分析和通過簡單的語法查詢

總結(jié):SparSQL是一個(gè)為了支持SQL而設(shè)計(jì)的工具,同時(shí)也支持命令式的API

數(shù)據(jù)處理選型(應(yīng)用場(chǎng)景)

Spark 的RDD主要用于處理 非結(jié)構(gòu)和數(shù)據(jù) 和半結(jié)構(gòu)化數(shù)據(jù)

Spark中的SQL主要用于處理 結(jié)構(gòu)化數(shù)據(jù)(較為規(guī)范的半結(jié)構(gòu)化數(shù)據(jù)也可以處理)

SparkSQL的數(shù)據(jù)抽象

DataFrame

DataFrame是特殊得RDD

DataFrame是一個(gè)分布式的表

DataFrame ==> RDD -(泛型) + Schema(列約束信息)+方便的SQL操作+優(yōu)化

DataSet

DataSet是特殊得DataFrame,DataFrame是特殊得RDD

DataSet是一個(gè)分布式的表

DataSet ==> DataFrame+泛型

DataSet == > RDD + Schema +方便的SQL操作 +優(yōu)化

區(qū)別

相互間的轉(zhuǎn)換

DataFrame = RDD - 泛型 +Schema + SQL + 優(yōu)化

DataSet = RDD +Schema + SQL +優(yōu)化

DataSet = DataFrame +泛型 +優(yōu)化

版本

RDD(Spark1.0) -> DataFrame(Saprk1.3) -> DataSet(Spark1.6)

Spark SQL 入門

●在spark2.0之后

這些都統(tǒng)一于SparkSession,SparkSession 封裝了SqlContext及HiveContext,實(shí)現(xiàn)了SQLContext及HiveContext所有功能

通過SparkSession還可以獲取到SparkConetxt

創(chuàng)建DataFrame

1.在本地創(chuàng)建一個(gè)文件,有三列,分別是id、name、age,用空格分隔,然后上傳到hdfs上。vim /root/person.txt

上傳數(shù)據(jù)文件到HDFS上:

hadoop fs -put /root/person.txt? /

2.在spark shell執(zhí)行下面命令,讀取數(shù)據(jù),將每一行的數(shù)據(jù)使用列分隔符分割

先執(zhí)行

/opt/soft/spark/bin/spark-shell

val lineRDD= sc.textFile("hdfs://node01:8020/person.txt").map(_.split(" "))?

3.定義case class(相當(dāng)于表的schema)

case class Person(id:Int, name:String, age:Int)

4.將RDD和case class關(guān)聯(lián)

val personRDD = lineRDD.map(x =>Person(x(0).toInt, x(1), x(2).toInt))? ? ? ? //RDD[Person]

5.將RDD轉(zhuǎn)換成DataFrame

val personDF = personRDD.toDF

6.查看數(shù)據(jù)和schema

personDF.show

personDF.printSchema

7.注冊(cè)表

personDF.createOrReplaceTempView("t_person")

8.執(zhí)行SQL

spark.sql("select id,name from t_person

where id > 3").show

9.也可以通過SparkSession構(gòu)建DataFrame

val dataFrame=spark.read.text("hdfs://node-01:9000/person.txt") //

dataFrame.show //直接讀取的文本文件沒有schema信息

創(chuàng)建DataSet

1.通過spark.createDataset創(chuàng)建

val fileRdd = sc.textFile("hdfs://node-01:9000/person.txt"

val ds1 = spark.createDataset(fileRdd)? //DataSet[String]讀取普通文本,需要添加schema

ds1.show

2.通RDD.toDS方法生成DataSet

case class Person(name:String, age:Int)

val data = List(Person("zhangsan",20),Person("lisi",30))?

val dataRDD = sc.makeRDD(data)

val ds2 = dataRDD.toDS?

ds2.show

3.通過DataFrame.as[泛型]轉(zhuǎn)化生成DataSet

case class Person(name:String, age:Long)

val jsonDF= spark.read.json("file:///opt/soft/spark/examples/src/main/resources/people.json")

val jsonDS = jsonDF.as[Person]?

jsonDS.show

4.DataSet也可以注冊(cè)成表進(jìn)行查詢

jsonDS.createOrReplaceTempView("t_person")

spark.sql("select * fromt_person").show

總結(jié)

不管是DataFrame還是DataSet都可以注冊(cè)成表,之后就可以使用SQL進(jìn)行查詢了

DEA開發(fā)Spark SQL

第1種:指定列名添加Schema

第2種:通過StructType指定Schema

第3種:編寫樣例類,利用反射機(jī)制推斷Schema

RDD、DF、DS之間的相互轉(zhuǎn)換(6種)

SQL風(fēng)格

DSL風(fēng)格

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容