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