深入了解SparkSQL的運(yùn)用及方法
一:SparkSQL
1.SparkSQL簡(jiǎn)介
Spark SQL是Spark的一個(gè)模塊,用于處理結(jié)構(gòu)化的數(shù)據(jù),它提供了一個(gè)數(shù)據(jù)抽象DataFrame(最核心的編程抽象就是DataFrame),并且SparkSQL作為分布式SQL查詢引擎。
Spark SQL就是將SQL轉(zhuǎn)換成一個(gè)任務(wù),提交到集群上運(yùn)行,類似于Hive的執(zhí)行方式。
2.SparkSQL運(yùn)行原理
將Spark SQL轉(zhuǎn)化為RDD,然后提交到集群執(zhí)行。
3.SparkSQL特點(diǎn)
(1)容易整合,Spark SQL已經(jīng)集成在Spark中
(2)提供了統(tǒng)一的數(shù)據(jù)訪問(wèn)方式:JSON、CSV、JDBC、Parquet等都是使用統(tǒng)一的方式進(jìn)行訪問(wèn)
(3)兼容 Hive
(4)標(biāo)準(zhǔn)的數(shù)據(jù)連接:JDBC、ODBC
二、SparkSQL運(yùn)用

package sql
import org.apache.avro.ipc.specific.Person
import org.apache.spark
import org.apache.spark.rdd.RDD
import org.apache.spark.sql
import org.apache.spark.sql.catalyst.InternalRow
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
import org.junit.Test
class Intro {
@Test
def dsIntro(): Unit ={
val spark: SparkSession = new sql.SparkSession.Builder()
.appName("ds intro")
.master("local[6]")
.getOrCreate()
//導(dǎo)入隱算是shi轉(zhuǎn)換
import spark.implicits._
val sourceRDD: RDD[Person] =spark.sparkContext.parallelize(Seq(Person("張三",10),Person("李四",15)))
val personDS: Dataset[Person] =sourceRDD.toDS();
//personDS.printSchema()打印出錯(cuò)信息
val resultDS: Dataset[Person] =personDS.where('age>10)
.select('name,'age)
.as[Person]
resultDS.show()
}
@Test
def dfIntro(): Unit ={
val spark: SparkSession =new SparkSession.Builder()
.appName("ds intro")
.master("local")
.getOrCreate()
import spark.implicits._
val sourceRDD: RDD[Person] = spark.sparkContext.parallelize(Seq(Person("張三",10),Person("李四",15)))
val df: DataFrame = sourceRDD.toDF()//隱shi轉(zhuǎn)換
df.createOrReplaceTempView("person")//創(chuàng)建表
val resultDF: DataFrame =spark.sql("select name from person where age>=10 and age<=20")
resultDF.show()
}
@Test
def database1(): Unit ={
//1.創(chuàng)建sparkSession
val spark: SparkSession =new SparkSession.Builder()
.appName("database1")
.master("local[6]")
.getOrCreate()
//2.導(dǎo)入引入shi子轉(zhuǎn)換
import spark.implicits._
//3.演示
val sourceRDD: RDD[Person] =spark.sparkContext.parallelize(Seq(Person("張三",10),Person("李四",15)))
val dataset: Dataset[Person] =sourceRDD.toDS()
//Dataset 支持強(qiáng)類型的API
dataset.filter(item => item.age >10).show()
//Dataset 支持若弱類型的API
dataset.filter('age>10).show()
//Dataset 可以直接編寫SQL表達(dá)式
dataset.filter("age>10").show()
}
@Test
def database2(): Unit ={
val spark: SparkSession = new SparkSession.Builder()
.master("local[6]")
.appName("database2")
.getOrCreate()
import spark.implicits._
val dataset: Dataset[Person] =spark.createDataset(Seq(Person("張三",10),Person("李四",20)))
//無(wú)論Dataset中放置的是什么類型的對(duì)象,最終執(zhí)行計(jì)劃中的RDD上都是internalRow
//直接獲取到已經(jīng)分析和解析過(guò)得Dataset的執(zhí)行計(jì)劃,從中拿到RDD
val executionRdd: RDD[InternalRow] =dataset.queryExecution.toRdd
//通過(guò)將Dataset底層的RDD通過(guò)Decoder轉(zhuǎn)成了和Dataset一樣的類型RDD
val typedRdd:RDD[Person] = dataset.rdd
println(executionRdd.toDebugString)
println()
println()
println(typedRdd.toDebugString)
}
@Test
def database3(): Unit = {
//1.創(chuàng)建sparkSession
val spark: SparkSession = new SparkSession.Builder()
.appName("database1")
.master("local[6]")
.getOrCreate()
//2.導(dǎo)入引入shi子轉(zhuǎn)換
import spark.implicits._
val dataFrame: DataFrame = Seq(Person("zhangsan", 15), Person("lisi", 20)).toDF()
//3.看看DataFrame可以玩出什么花樣
//select name from...
dataFrame.where('age > 10)
.select('name)
.show()
}
// @Test
// def database4(): Unit = {
// //1.創(chuàng)建sparkSession
// val spark: SparkSession = new SparkSession.Builder()
// .appName("database1")
// .master("local[6]")
// .getOrCreate()
// //2.導(dǎo)入引入shi子轉(zhuǎn)換
// import spark.implicits._
// val personList=Seq(Person("zhangsan",15),Person("lisi",20))
//
// //1.toDF
// val df1: DataFrame =personList.toDF()
// val df2: DataFrame =spark.sparkContext.parallelize(personList).toDF()
// //2.createDataFrame
// val df3: DataFrame =spark.createDataFrame(personList)
//
// //3.read
// val df4: DataFrame =spark.read.csv("")
// df4.show()
// }
//toDF()是轉(zhuǎn)成DataFrame,toDs是轉(zhuǎn)成Dataset
// DataFrame就是Dataset[Row] 代表弱類型的操作,Dataset代表強(qiáng)類型的操作,中的類型永遠(yuǎn)是row,DataFrame可以做到運(yùn)行時(shí)類型安全,Dataset可以做到 編譯時(shí)和運(yùn)行時(shí)都安全
@Test
def database4(): Unit = {
//1.創(chuàng)建sparkSession
val spark: SparkSession = new SparkSession.Builder()
.appName("database1")
.master("local[6]")
.getOrCreate()
//2.導(dǎo)入引入shi子轉(zhuǎn)換
import spark.implicits._
val personList=Seq(Person("zhangsan",15),Person("lisi",20))
//DataFrame代表弱類型操作是編譯時(shí)不安全
val df: DataFrame =personList.toDF()
//Dataset是強(qiáng)類型的
val ds: Dataset[Person] =personList.toDS()
ds.map((person:Person) =>Person(person.name,person.age))
}
@Test
def row(): Unit ={
//1.Row如何創(chuàng)建,它是什么
//row對(duì)象必須配合Schema對(duì)象才會(huì)有列名
val p: Person =Person("zhangsan",15)
val row: Row =Row("zhangsan",15)
//2.如何從row中獲取數(shù)據(jù)
row.getString(0)
row.getInt(1)
//3.Row也是樣例類、
row match {
case Row(name,age) => println(name,age)
}
}
}
case class Person(name: String, age: Int)

到此這篇關(guān)于深入了解SparkSQL的運(yùn)用及方法的文章就介紹到這了,更多相關(guān)SparkSQL運(yùn)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring MVC整合Shiro權(quán)限控制的方法
這篇文章主要介紹了Spring MVC整合Shiro權(quán)限控制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
OPENCV+JAVA實(shí)現(xiàn)人臉識(shí)別
這篇文章主要為大家詳細(xì)介紹了OPENCV+JAVA實(shí)現(xiàn)人臉識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
MybatisPlus實(shí)現(xiàn)數(shù)據(jù)權(quán)限隔離的示例詳解
Mybatis Plus對(duì)Mybatis做了無(wú)侵入的增強(qiáng),非常的好用,今天就給大家介紹它的其中一個(gè)實(shí)用功能:數(shù)據(jù)權(quán)限插件,感興趣的可以跟隨小編一起了解下2024-04-04
java高效打印一個(gè)二維數(shù)組的實(shí)例(不用遞歸,不用兩個(gè)for循環(huán))
下面小編就為大家?guī)?lái)一篇java高效打印一個(gè)二維數(shù)組的實(shí)例(不用遞歸,不用兩個(gè)for循環(huán))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
Java的lambda表達(dá)式實(shí)現(xiàn)解析
這篇文章主要為大家詳細(xì)介紹了Java的lamda表達(dá)式實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
聊聊Spring Boot 如何集成多個(gè) Kafka
這篇文章主要介紹了Spring Boot 集成多個(gè) Kafka的相關(guān)資料,包括配置文件,生成者和消費(fèi)者配置過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-10-10
Java數(shù)據(jù)結(jié)構(gòu)之單鏈表詳解
在之前的學(xué)習(xí)中,我們主要了解了很多 Java 的 基本語(yǔ)法,但是在之后的 Java學(xué)習(xí)中,了解基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)的知識(shí)非常重要,數(shù)據(jù)結(jié)構(gòu)的思想可以幫助我們更加清晰明白的了解 Java 的解題思路等等.今天我們就來(lái)開(kāi)始學(xué)習(xí)實(shí)現(xiàn)一個(gè)Java基礎(chǔ)的單鏈表,需要的朋友可以參考下2021-05-05

