Spark-SQL

Spark-SQL 概述

Spark SQL 是 Spark 用于結構化數據(structured data)處理的 Spark 模塊

Shark 是伯克利實驗室 Spark 生態環境的組件之一,是基于 Hive 所開發的工具,它修改了內存管理、物理計劃、執行三個模塊,并使之能運行在 Spark 引擎上

Shark 的出現,使得 SQL-on-Hadoop 的性能比 Hive 有了 10-100 倍的提高

Spark 團隊重新開發了SparkSQL代碼;擺脫了對Hive的依賴性,SparkSQL 無論在數據兼容、性能優化、組件擴展方面都得到了極大的方便

1.數據兼容方面 SparkSQL 不但兼容 Hive,還可以從 RDD、parquet 文件、JSON 文件中 獲取數據,未來版本甚至支持獲取 RDBMS 數據以及 cassandra 等 NOSQL 數據

2.性能優化方面 除了采取 In-Memory Columnar Storage、byte-code generation 等優化技術 外、將會引進 Cost Model 對查詢進行動態評估、獲取最佳物理計劃等等

3.組件擴展方面無論是 SQL 的語法解析器、分析器還是優化器都可以重新定義,進行擴 展

Spark-SQL 特點

1.易整合。無縫的整合了 SQL 查詢和 Spark 編程

2.統一的數據訪問。使用相同的方式連接不同的數據源

3.兼容 Hive。在已有的倉庫上直接運行 SQL 或者 HQL

4.標準數據連接。通過 JDBC 或者 ODBC 來連接

DataFrame

在 Spark 中,DataFrame 是一種以 RDD 為基礎的分布式數據集,類似于傳統數據庫中 的二維表格

DataFrame 與 RDD 的區別

主要區別在于,前者帶有 schema 元信息,即 DataFrame 所表示的二維表數據集的每一列都帶有名稱和類型

?DataSet

DataSet 是分布式數據集合,是 DataFrame 的一個擴展,是 SparkSQL 最新的數據抽象。它提供了 RDD 的優勢(強類型,使用強大的 lambda 函數的能力)以及 Spark SQL 優化執行引擎的優點。DataSet 也可以使用功能性的轉換(操作 map,flatMap,filter 等等)

Spark-SQL核心編程(一)

DataFrame

Spark SQL 的 DataFrame API 允許我們使用 DataFrame 而不用必須去注冊臨時表或者生成 SQL 表達式。DataFrame API 既有 transformation 操作也有 action 操作

創建 DataFrame

在?Spark SQL 中 SparkSession 是創建 DataFrame 和執行 SQL 的入口,創建 DataFrame

有三種方式:通過?Spark 的數據源進行創建;從一個存在的 RDD 進行轉換;還可以從 Hive

Table 進行查詢返回

Spark-SQL支持的數據類型:

在 spark 的 bin/data 目錄中創建 user.json 文件并在文件中添加數據

讀取 json 文件創建 DataFrame,展示數據

SQL 語法

SQL 語法風格是指我們查詢數據的時候使用 SQL 語句來查詢,這種風格的查詢必須要

有臨時視圖或者全局視圖來輔助

實例:

? 讀取 JSON 文件創建 DataFrame

對 DataFrame 創建一個臨時表,通過 SQL 語句實現查詢全表,結果展示

Spark-SQL核心編程(二)

DSL 語法

DataFrame 提供一個特定領域語言(domain-specific language, DSL)去管理結構化的數據

可以在 Scala, Java, Python 和 R 中使用 DSL,使用 DSL 語法風格

實例:

創建一個 DataFrame

查看 DataFrame 的 Schema 信息

只查看"username"列數據

    查看"username"列數據以及"age+1"數據

    注意:涉及到運算的時候, 每列都必須使用$, 或者采用引號表達式:單引號+字段名

    查看"age"大于"18"的數據

    按照"age"分組,查看數據條數

    RDD 轉換為 DataFrame

    創建id.txt,并添加數據

    將數據導入并查詢

    實際開發中,一般通過樣例類將 RDD 轉換為 DataFrame

    DataFrame 轉換為 RDD

    DataFrame 其實就是對 RDD 的封裝,所以可以直接獲取內部的 RDD

    實例:

    注意:此時得到的 RDD 存儲類型為 Row

    Spark-SQL核心編程(三)

    DataSet

    創建 DataSet

    實例:

    使用樣例類序列創建 DataSet

    使用基本類型的序列創建 DataSet

    注意:在實際使用的時候,很少用到把序列轉換成DataSet,更多的是通過RDD來得到DataSet

    RDD 轉換為 DataSet

    parkSQL 能夠自動將包含有 case 類的 RDD 轉換成 DataSet,case 類定義了 table 的結 構,case 類屬性通過反射變成了表的列名

    實例:

    DataSet 轉換為 RDD

    DataSet 其實也是對 RDD 的封裝,所以可以直接獲取內部的 RDD

    實例:

    此處報錯原因是 res3 ?并不存在(從前面代碼看沒有定義過 res3 ?),而且即使存在,如果它的類型不是包含 rdd ?成員的類型(比如不是 Dataset ?等相關類型)

    DataFrame 和 DataSet 轉換

    DataFrame 其實是 DataSet 的特例,所以它們之間是可以互相轉換的

    DataFrame 轉換為 DataSet

    實例

    DataSet 轉換為 DataFrame

    實例

    RDD、DataFrame、DataSet 三者的關系

    從版本的產生上來看:

    Spark1.0 => RDD

    Spark1.3 => DataFrame

    Spark1.6 => Dataset

    同樣的數據都給到這三個數據結構,他們分別計算之后,都會給出相同的結果。不

    同是的他們的執行效率和執行方式。在后期的?Spark 版本中,DataSet 有可能會逐步取代 RDD和?DataFrame 成為唯一的 API 接口

    三者的共性

    1)RDD、DataFrame、DataSet 全都是 spark 平臺下的分布式彈性數據集,為處理超大型數

    據提供便利;

    2)三者都有惰性機制,在進行創建、轉換,如 map 方法時,不會立即執行,只有在遇到

    Action 如 foreach 時,三者才會開始遍歷運算;

    3)三者有許多共同的函數,如 filter,排序等;

    4)在對 DataFrame 和 Dataset 進行操作許多操作都需要這個包:

    ????????import spark.implicits._(在創建好?SparkSession 對象后盡量直接導入)

    5)三者都會根據 Spark 的內存情況自動緩存運算,這樣即使數據量很大,也不用擔心會

    內存溢出

    6)三者都有分區(partition)的概念

    7)DataFrame 和 DataSet 均可使用模式匹配獲取各個字段的值和類型

    三者的區別

    1) RDD

    ??RDD 一般和 spark mllib 同時使用

    ??RDD 不支持 sparksql 操作

    2) DataFrame

    ??與 RDD 和 Dataset 不同,DataFrame 每一行的類型固定為Row,每一列的值沒法直

    接訪問,只有通過解析才能獲取各個字段的值

    ??DataFrame 與 DataSet 一般不與 spark mllib 同時使用

    ??DataFrame 與 DataSet 均支持 SparkSQL 的操作,比如 select,groupby 之類,還能

    注冊臨時表/視窗,進行 sql 語句操作

    ??DataFrame 與 DataSet 支持一些特別方便的保存方式,比如保存成 csv,可以帶上表

    頭,這樣每一列的字段名一目了然

    3) DataSet

    ??Dataset 和 DataFrame 擁有完全相同的成員函數,區別只是每一行的數據類型不同。

    DataFrame 其實就是 DataSet 的一個特例 type DataFrame = Dataset[Row]

    ??DataFrame 也可以叫 Dataset[Row],每一行的類型是 Row,不解析,每一行究竟有哪

    些字段,各個字段又是什么類型都無從得知,只能用上面提到的?getAS 方法或者共性里提到的模式匹配拿出特定字段。而?Dataset 中,每一行是什么類型是不一定的,在自定義了?case class 之后可以很自由的獲得每一行的信息

    三者可以通過上圖的方式進行相互轉換

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/bicheng/76854.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76854.shtml
    英文地址,請注明出處:http://en.pswp.cn/bicheng/76854.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    Java 在人工智能領域的突圍:從企業級架構到邊緣計算的技術革新

    一、Java AI 的底層邏輯:從語言特性到生態重構 在 Python 占據 AI 開發主導地位的當下,Java 正通過技術重構實現突圍。作為擁有 30 年企業級開發經驗的編程語言,Java 的核心優勢在于強類型安全、內存管理能力和分布式系統支持,這…

    編程實現除法程序時需要注意的細節

    使用Python實現除法程序時,需注意以下關鍵細節: 除數為零的處理 必須檢查除數是否為零,否則會觸發ZeroDivisionError異常。可通過try-except結構捕獲異常并處理。 整數除法與浮點數除法的區別 ? 使用/運算符時,無論操作數是否為…

    Java萬級并發場景-實戰解決

    今天我們來做一個典型的消費力度能達到萬級別的并發場景,老師點名-學生簽到 正常情況 正常情況來說是不同班級下的老師發布不同的點名--然后不同班級下的很多學生同一時間進行簽到,簽到成功就去修改數據庫,簽到失敗就返回,但是這…

    openGauss新特性 | 自動參數化執行計劃緩存

    目錄 自動化參數執行計劃緩存簡介 SQL參數化及約束條件 一般常量參數化示例 總結 自動化參數執行計劃緩存簡介 執行計劃緩存用于減少執行計劃的生成次數。openGauss數據庫會緩存之前生成的執行計劃,以便在下次執行該SQL時直接使用,可…

    計算機操作系統——存儲器管理

    系列文章目錄 1.存儲器的層次結構 2.程序的裝入和鏈接 3.連續分配存儲管理方式(內存夠用) 4.對換(Swapping)(內存不夠用) 5.分頁存儲管理方式 6.分段存儲管理方式 文章目錄 系列文章目錄前言一、存儲器的存儲結構寄存器&…

    KF V.S. GM-PHD

    在計算機視覺的多目標跟蹤(MOT)任務中,卡爾曼濾波(KF)和高斯混合概率假設密度(GM-PHD)濾波器是兩種經典的狀態估計方法,但它們的原理和應用場景存在顯著差異。以下是兩者的核心機制和…

    車載通信架構 --- DOIP系統機制初入門

    我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

    C++對象池設計:從高頻`new/delete`到性能飛躍的工業級解決方案

    一、new/delete的性能之殤:一個真實的生產事故 2023年某證券交易系統在峰值時段出現請求堆積,事后定位發現:每秒40萬次的訂單對象創建/銷毀,導致: 內存碎片率高達37%(jemalloc統計)malloc調用…

    【C/C++】深入理解整型截斷與提升:原理、應用與區別

    文章目錄 1. 整形截斷(Integer Truncation)1.1 整形截斷的例子1.2 整形截斷的細節 2. 整形提升(Integer Promotion)2.1 整形提升的規則2.2 整形提升的示例2.3 整形提升的實際應用2.4 整型提升與標準操作符 3. 整型截斷與提升的區別…

    python藍橋杯備賽常用算法模板

    一、python基礎 (一)集合操作 s1 {1,2,3} s2{3,4,5} print(s1|s2)#求并集 print(s1&s2)#求交集 #結果 #{1, 2, 3, 4, 5} #{3}(二)對多維列表排序 1.新建列表 list1[[1,2,3],[2,3,4],[0,3,2]] #提取每個小列表的下標為2的…

    【模塊化拆解與多視角信息3】教育背景:學歷通脹時代的生存法則

    教育背景:學歷通脹時代的生存法則 寫在最前 作為一個中古程序猿,我有很多自己想做的事情,比如埋頭苦干手搓一個低代碼數據庫設計平臺(目前只針對寫java的朋友),比如很喜歡幫身邊的朋友看看簡歷,講講面試技巧,畢竟工作這么多年,也做到過高管,有很多面人經歷,意見還算…

    uniapp實現H5頁面麥克風權限獲取與錄音功能

    1.權限配置 在uni-app開發H5頁面時,需要在manifest.json文件中添加錄音權限的配置。具體如下: {"h5": {"permissions": {"scope.record": {"desc": "請授權使用錄音功能"}}} }這段配置代碼是用于向…

    功能豐富的PDF處理免費軟件推薦

    軟件介紹 今天給大家介紹一款超棒的PDF工具箱,它處理PDF文檔的能力超強,而且是完全免費使用的,沒有任何限制。 TinyTools(PC)這款軟件,下載完成后即可直接打開使用。在使用過程中,操作完畢后&a…

    鴻蒙開發-ArkUi控件使用

    2.0控件-按鈕 2.1.控件-文本框 Text(this.message).fontSize(40) // 設置文本的文字大小.fontWeight(FontWeight.Bolder) // 設置文本的粗細.fontColor(Color.Red) // 設置文本的顏色------------------------------------------------------------------------- //設置邊框Tex…

    深入理解 ResponseBodyAdvice 及其應用

    ResponseBodyAdvice 是 Spring MVC 提供的一個強大接口&#xff0c;允許你在響應體被寫入 HTTP 響應之前對其進行全局處理。 下面我將全面介紹它的工作原理、使用場景和最佳實踐。 基本概念 接口定義 public interface ResponseBodyAdvice<T> {boolean supports(Metho…

    深度解析Redis過期字段清理機制:從源碼到集群化實踐 (一)

    深度解析Redis過期字段清理機制&#xff1a;從源碼到集群化實踐 一、問題本質與架構設計 1.1 過期數據管理的核心挑戰 Redis連接池時序圖技術方案 ??設計規范&#xff1a;? #mermaid-svg-Yr9fBwszePgHNnEQ {font-family:"trebuchet ms",verdana,arial,sans-se…

    數據庫ocm有什么用

    專業能力的權威象征 。技術水平的高度認可&#xff1a;OCM 是 Oracle 認證體系中的最高級別&#xff0c;代表著持證人在 Oracle 數據庫領域具備深厚的專業知識和卓越的實踐技能。它證明持證人能夠熟練掌握數據庫的安裝、配置、管理、優化、備份恢復等核心技術&#xff0c;并且能…

    無人船 | 圖解基于視線引導(LOS)的無人艇制導算法

    目錄 1 視線引導法介紹2 LOS制導原理推導3 Lyapunov穩定性分析4 LOS制導效果 1 視線引導法介紹 視線引導法&#xff08;Line of Sight, LOS&#xff09;作為無人水面艇&#xff08;USV&#xff09;自主導航領域的核心技術&#xff0c;通過幾何制導與動態控制深度融合的機制&am…

    Swift觀察機制新突破:如何用AsyncSequence實現原子化數據監聽?

    網羅開發 &#xff08;小紅書、快手、視頻號同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企業從事人工智能項目研發管理工作&#xff0c;平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

    【KWDB創作者計劃】_KWDB部署與使用詳細版本

    KWDB發展歷程 介紹KWDB前&#xff0c;先介紹下KaiwuDB&#xff0c; KaiwuDB 是浪潮控股的數據庫企業&#xff0c;該企業提供的KaiwuDB數據庫是一款分布式多模數據庫產品&#xff0c;主要面向工業物聯網、數字能源、車聯網、智慧產業等行業領域。 在2024年7月&#xff0c; Kai…