99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代Spark SQL 結(jié)構(gòu)化數(shù)據(jù)處理流程及原理是什么?
Spark SQL 結(jié)構(gòu)化數(shù)據(jù)處理流程及原理是什么?
2025-01-09
收藏
SparkSQL 結(jié)構(gòu)化數(shù)據(jù)處理流程及原理是什么?Spark SQL 可以使用現(xiàn)有的Hive元存儲、SerDes 和 UDF。它可以使用 JDBC/ODBC 連接到現(xiàn)有的 BI 工具。有了 Spark SQL,用戶可以編寫 SQL 風(fēng)格的查詢。
Spark SQL 是 Spark 生態(tài)系統(tǒng)中處理結(jié)構(gòu)化格式數(shù)據(jù)的模塊。它在內(nèi)部使用 Spark Core API 進(jìn)行處理,但對用戶的使用進(jìn)行了抽象。這篇文章深入淺出地告訴你 Spark SQL 3.x 的新內(nèi)容。
這對于精通結(jié)構(gòu)化查詢語言或 SQL 的廣大用戶群體來說,基本上是很有幫助的。用戶也將能夠在結(jié)構(gòu)化數(shù)據(jù)上編寫交互式和臨時性的查詢。Spark SQL 彌補(bǔ)了彈性分布式數(shù)據(jù)集RDD和關(guān)系表之間的差距。RDD 是 Spark 的基本數(shù)據(jù)結(jié)構(gòu)。它將數(shù)據(jù)作為分布式對象存儲在適合并行處理的節(jié)點集群中。RDD 很適合底層處理,但在運(yùn)行時很難調(diào)試,程序員不能自動推斷模式schema。另外,RDD 沒有內(nèi)置的優(yōu)化功能。Spark SQL 提供了數(shù)據(jù)幀DataFrame和數(shù)據(jù)集來解決這些問題。
Spark SQL 可以使用現(xiàn)有的 Hive 元存儲、SerDes 和 UDF。它可以使用 JDBC/ODBC 連接到現(xiàn)有的 BI 工具。
數(shù)據(jù)源
大數(shù)據(jù)處理通常需要處理不同的文件類型和數(shù)據(jù)源(關(guān)系型和非關(guān)系型)的能力。Spark SQL 支持一個統(tǒng)一的數(shù)據(jù)幀接口來處理不同類型的源,如下所示。
文件:
CSV
Text
JSON
XML
JDBC/ODBC:
Postgres
帶模式的文件:
AVRO
Parquet
Hive 表:
Spark SQL 也支持讀寫存儲在 Apache Hive 中的數(shù)據(jù)。
通過數(shù)據(jù)幀,用戶可以無縫地讀取這些多樣化的數(shù)據(jù)源,并對其進(jìn)行轉(zhuǎn)換/連接。
Spark SQL 3.x 的新內(nèi)容
在以前的版本中(Spark 2.x),查詢計劃是基于啟發(fā)式規(guī)則和成本估算的。從解析到邏輯和物理查詢計劃,最后到優(yōu)化的過程是連續(xù)的。這些版本對轉(zhuǎn)換和行動的運(yùn)行時特性幾乎沒有可見性。因此,由于以下原因,查詢計劃是次優(yōu)的:
1、缺失和過時的統(tǒng)計數(shù)據(jù)
2、次優(yōu)的啟發(fā)式方法
3、錯誤的成本估計
Spark 3.x 通過使用運(yùn)行時數(shù)據(jù)來迭代改進(jìn)查詢計劃和優(yōu)化,增強(qiáng)了這個過程。前一階段的運(yùn)行時統(tǒng)計數(shù)據(jù)被用來優(yōu)化后續(xù)階段的查詢計劃。這里有一個反饋回路,有助于重新規(guī)劃和重新優(yōu)化執(zhí)行計劃。

添加圖片注釋,不超過 140 字(可選)

自適應(yīng)查詢執(zhí)行(AQE)
查詢被改變?yōu)檫壿嬘媱潱詈笞兂晌锢碛媱?。這里的概念是“重新優(yōu)化”。它利用前一階段的可用數(shù)據(jù),為后續(xù)階段重新優(yōu)化。正因為如此,整個查詢的執(zhí)行要快得多。
動態(tài)合并“洗牌”分區(qū)
Spark 在“洗牌shuffle”操作后確定最佳的分區(qū)數(shù)量。在 AQE 中,Spark 使用默認(rèn)的分區(qū)數(shù),即 200 個。這可以通過配置來啟用。
動態(tài)切換連接策略
廣播哈希是最好的連接操作。如果其中一個數(shù)據(jù)集很小,Spark 可以動態(tài)地切換到廣播連接,而不是在網(wǎng)絡(luò)上“洗牌”大量的數(shù)據(jù)。
動態(tài)優(yōu)化傾斜連接
如果數(shù)據(jù)分布不均勻,數(shù)據(jù)會出現(xiàn)傾斜,會有一些大的分區(qū)。這些分區(qū)占用了大量的時間。Spark 3.x 通過將大分區(qū)分割成多個小分區(qū)來進(jìn)行優(yōu)化。
其他改進(jìn)措施
此外,Spark SQL 3.x還支持以下內(nèi)容。
動態(tài)分區(qū)修剪
3.x 將只讀取基于其中一個表的值的相關(guān)分區(qū)。這消除了解析大表的需要。
連接提示
如果用戶對數(shù)據(jù)有了解,這允許用戶指定要使用的連接策略。這增強(qiáng)了查詢的執(zhí)行過程。
兼容 ANSI SQL
在兼容 Hive 的早期版本的 Spark 中,我們可以在查詢中使用某些關(guān)鍵詞,這樣做是完全可行的。然而,這在 Spark SQL 3 中是不允許的,因為它有完整的 ANSI SQL 支持。例如,“將字符串轉(zhuǎn)換為整數(shù)”會在運(yùn)行時產(chǎn)生異常。它還支持保留關(guān)鍵字。
較新的 Hadoop、Java 和 Scala 版本
從 Spark 3.0 開始,支持 Java 11 和 Scala 2.12。 Java 11 具有更好的原生協(xié)調(diào)和垃圾校正,從而帶來更好的性能。 Scala 2.12 利用了 Java 8 的新特性,優(yōu)于 2.11。

Spark 3.x 提供了這些現(xiàn)成的有用功能,而無需開發(fā)人員操心。這將顯著提高 Spark 的整體性能。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }