sql編程基礎(chǔ) pdf SQL的API允許直接使用而不用必須去注冊(cè)臨時(shí)表
2021-09-01
內(nèi)容
基本介紹
模型和模型是 SQL 提供的兩個(gè)編程抽象。核心編程主要是使用和模型進(jìn)行編程,以及它們之間的關(guān)系和轉(zhuǎn)換。
在 Core 中,如果要執(zhí)行應(yīng)用程序,首先需要構(gòu)建上下文環(huán)境對(duì)象。 SQL其實(shí)可以理解為Core的一種封裝。不僅封裝了模型,還封裝了上下文環(huán)境對(duì)象。
舊版本提供了兩個(gè)SQL查詢(xún)起點(diǎn):
是最新的SQL查詢(xún)的起點(diǎn),本質(zhì)上是and的組合,所以API可以在on上使用,也可以在on上使用。內(nèi)部封裝了,所以計(jì)算實(shí)際上是由.
SQL API 允許直接使用,無(wú)需注冊(cè)臨時(shí)表或生成 SQL 表達(dá)式。 API 既有操作又有操作。
創(chuàng)建
在SQL中,是創(chuàng)建和執(zhí)行SQL的入口。共有三種創(chuàng)建方式:
(1)由
的數(shù)據(jù)源創(chuàng)建
①進(jìn)入
[xzc@hadoop102 spark-local]$ bin/spark-shell
②查看支持文件創(chuàng)建的數(shù)據(jù)源格式
scala> spark.read.
③在
的bin/data目錄下創(chuàng)建user.json文件
{"username": "zhangsan","age":20}
{"username": "lisi", "age":30}
{"username": "wangwu", "age":40}
④讀取json文件創(chuàng)建
scala> val df = spark.read.json("data/user.json")
⑤顯示結(jié)果
scala> df.show
(2)從RDD轉(zhuǎn)換
在IDEA中開(kāi)發(fā)程序時(shí),如果需要RDD和DF或DS的互操作,需要引入如下代碼:
import spark.implicits._
這里不是包名in,而是創(chuàng)建對(duì)象的變量名,所以必須先創(chuàng)建對(duì)象再導(dǎo)入。這里的對(duì)象不能用var聲明,因?yàn)橹恢С忠雟al修飾的對(duì)象。在-中,不需要導(dǎo)入,這個(gè)操作是自動(dòng)完成的。
①在
的bin/data目錄下創(chuàng)建id.txt文件
②讀取txt文件
scala> val idRDD = sc.textFile("data/id.txt")
③轉(zhuǎn)換并顯示結(jié)果
scala> idRDD.toDF("id").show
注意:在實(shí)際開(kāi)發(fā)中,RDD一般轉(zhuǎn)換為
scala> case class User(name:String, age:Int)
scala> sc.makeRDD(List(("zhangsan",30), ("lisi",40))).map(t=>User(t._1, t._2)).toDF.show
(3)從 Hive 查詢(xún)返回
Hive 是 SQL 引擎。 SQL 可以在有或沒(méi)有 Hive 支持的情況下編譯。包含 Hive 支持的 SQL 可以支持 Hive 表訪問(wèn)、UDF(用戶(hù)自定義函數(shù))和 Hive 查詢(xún)語(yǔ)言(/HQL)等。需要強(qiáng)調(diào)的是,如果要在 SQL 中包含 Hive 庫(kù),則不需要提前安裝Hive。要將 SQL 連接到已部署的 Hive,您必須將 hive-site.xml 復(fù)制到配置文件目錄 ($/conf)。即使沒(méi)有部署Hive,SQL仍然可以運(yùn)行。
下載hive-site.xml文件,需要根據(jù)自己的配置修改個(gè)別內(nèi)容
注意:如果你還沒(méi)有部署Hivesql編程基礎(chǔ) pdf,SQL會(huì)在當(dāng)前工作目錄下創(chuàng)建自己的Hive元數(shù)據(jù)倉(cāng)庫(kù),稱(chēng)為它。此外,如果您嘗試使用 (not) 語(yǔ)句創(chuàng)建表,這些表將被放置在您默認(rèn)文件系統(tǒng)的 /user/hive/ 目錄中(如果您有一個(gè)完善的 hdfs-site.xml ,則默認(rèn)文件系統(tǒng)為HDFS,否則為本地文件系統(tǒng))。
- Hive 默認(rèn)支持;代碼中默認(rèn)不支持,需要手動(dòng)指定(加個(gè)參數(shù)即可)。
1) 嵌入式 HIVE
如果你使用內(nèi)嵌的Hive,你什么都不用做,直接使用即可。
存儲(chǔ)Hive的元數(shù)據(jù),默認(rèn)倉(cāng)庫(kù)地址:$/-
①展示
scala> spark.sql("show tables").show
②創(chuàng)建表格
scala> spark.sql("create table aa(id int)")
③將本地?cái)?shù)據(jù)加載到表格中并顯示
scala> spark.sql("load data local inpath 'data/id.txt' into table aa")
scala> spark.sql("select * from aa").show
注意:在實(shí)際使用中,幾乎沒(méi)有人會(huì)使用內(nèi)置的Hive
2)外的HIVE
如果要連接到外部部署的 Hive,則需要執(zhí)行以下步驟:
是強(qiáng)類(lèi)型數(shù)據(jù)集合,需要提供對(duì)應(yīng)的類(lèi)型信息。
創(chuàng)建
有兩種創(chuàng)建方式:
(1) with
①創(chuàng)建示例類(lèi)
scala> case class Person(name: String, age: Long)
②向表格中添加數(shù)據(jù)并顯示
scala> val caseClassDS = Seq(Person("zhangsan",2)).toDS()
scala> caseClassDS.show
(2)使用基本類(lèi)型的序列創(chuàng)建
①創(chuàng)建
scala> val ds = Seq(1,2,3,4,5).toDS
②顯示數(shù)據(jù)
scala> ds.show
注意:在實(shí)際使用中,很少用于將序列轉(zhuǎn)換成,更多的是通過(guò)RDD獲取
將 RDD 轉(zhuǎn)換為
包含case類(lèi)的RDD可以自動(dòng)轉(zhuǎn)換為case類(lèi)定義的結(jié)構(gòu),通過(guò)反射將case類(lèi)屬性轉(zhuǎn)換為表的列名。 Case 類(lèi)可以包含復(fù)雜的結(jié)構(gòu),例如 Seq 或 Seq。
scala> case class User(name:String, age:Int)
scala> sc.makeRDD(List(("zhangsan",30), ("lisi",49))).map(t=>User(t._1, t._2)).toDS
轉(zhuǎn)換為RDD
其實(shí)也是對(duì)RDD的封裝,所以可以直接獲取內(nèi)部RDD
scala> case class User(name:String, age:Int)
scala> sc.makeRDD(List(("zhangsan",30), ("lisi",49))).map(t=>User(t._1, t._2)).toDS
scala> val rdd = res11.rdd
scala> rdd.collect
和轉(zhuǎn)化
實(shí)際上是一個(gè)特例,所以它們可以相互轉(zhuǎn)換。
(1)被轉(zhuǎn)換為
scala> case class User(name:String, age:Int)
scala> val df = sc.makeRDD(List(("zhangsan",30), ("lisi",49))).toDF("name","age")
scala> val ds = df.as[User]
(2) 轉(zhuǎn)換為
scala> val ds = df.as[User]
scala> val df = ds.toDF
RDD與RDD的關(guān)系
In 為我們提供了兩個(gè)新的抽象,即 and。它們和RDD有什么區(qū)別?首先從版本生成的角度:
如果給這三個(gè)數(shù)據(jù)結(jié)構(gòu)賦予相同的數(shù)據(jù)sql編程基礎(chǔ) pdf,分別計(jì)算后,都會(huì)給出相同的結(jié)果。區(qū)別在于它們的執(zhí)行效率和執(zhí)行方法。在以后的版本中,可能會(huì)逐漸取代RDD,成為唯一的API接口。
三者的共同點(diǎn)
(1)RDD,都是平臺(tái)下的分布式彈性數(shù)據(jù)集,為處理超大數(shù)據(jù)提供了便利;
(2)三者都有惰性機(jī)制,創(chuàng)建轉(zhuǎn)換的時(shí)候,比如map方法,不會(huì)立即執(zhí)行,只有遇到比如,三者才會(huì)開(kāi)始遍歷操作;
(3)三者有很多常用的功能,比如,排序等;
(4)很多操作都需要這個(gè)包:.._(創(chuàng)建對(duì)象后嘗試直接導(dǎo)入)
(5)三者會(huì)根據(jù)內(nèi)存情況自動(dòng)緩存操作,這樣即使數(shù)據(jù)量很大也不必?fù)?dān)心內(nèi)存溢出
(6)三個(gè)都有
的概念
(7)和兩者都可以使用模式匹配來(lái)獲取每個(gè)字段的值和類(lèi)型
三者的區(qū)別
(1)RDD
(2)
(3)
三者相互轉(zhuǎn)換。