U-SQL 介紹 - 大數據處理語言
微軟宣布了新的 Azure 數據湖(Azure Data Lake)服務,該服務被用于云分析,包括了一個超大規模信息庫;一個在 YARN 上建立的新的的分析服務,該服務允許數據開發者和數據科學家分析全部的數據;還有 HDInsight,一個全面管理 Hadoop、Spark、Storm 和 HBase 的服務。Azure 數據湖分析包括 U-SQL,這個語言綜合了 SQL 的優點與你自己所寫代碼的表現能力。U-SQL 的可擴展分布式查詢功能讓你可以有效地分析存儲器或關聯存儲器(比如 AzureSQL 數據庫(Azure SQL Database))內的數據。這篇博文中,我將會概述 U-SQL 的開發目標、我們的一些靈感和這個語言背后的設計理念,同時我會向你展示一些用于說明這個語言幾個主要方面的例子。
為什么我們需要 U-SQL?
如果你分析了的大數據分析的特點,就會很容易的產生一些有關易用性的需求,一個功能強大的語言應該:
-
可以處理任何類型的數據。例如從安全日志中分析僵尸網絡(BotNet)攻擊模式,通過機器學習來提取圖像和視頻中的特征,這種語言需要允許你操作任何類型的數據。
</li> -
使用自定義的代碼很容易地表現復雜的(經常是表現某公司自營業務的)算法。舉例來說,基礎的查詢語言通常不易表達自定義的過程,從用戶定義的函數到他們自定義的輸入輸出格式都是如此。
</li> -
對任何尺度的數據進行有效的縮放,你無須再關心擴展拓撲(scale-out topology)、管道代碼或特定分布式基礎設施的限制。
</li> </ul>現有的大數據語言該如何處理這些需求?
基于 SQL 的語言(例如 Hive 等)提供聲明性的方式,原生支持擴容,并行執行以及優化。這個特性使得其簡單易用,被開發人員廣泛使用;其功能強大,適用于很多標準的分析及倉儲類型。不過他們的擴展模型和對非結構化數據及文件的支持經常只是些附屬功能,不容易使用。比如,即使您只想快速瀏覽一下文件或者遠程數據,您也需要在查詢之前先創建編目對象,將其系統化。這點嚴重降低了語言的敏捷性。雖然基于 SQL 的語言通常有一些擴展點來定制格式,定義函數以及聚合,但是他們的構建,集成和維護相當復雜,各種編程語言的支持也差別很大。
用基于編程語言的方式來處理大數據,這樣方式可以簡單方便地添加定制化代碼。但是,程序員通常需要另外編寫代碼來處理擴容和性能,并且難以管理執行拓撲和工作流。比如不同執行階段的并發或者架構擴容。這樣的代碼不僅難寫,而且不易優化性能。有些框架支持聲明式組件,例如集成語言查詢,或者嵌入式 SQL 支持。但是 SQL 可能會被當做字符串處理,沒有輔助工具。并且可擴展性集成較差,由于程序性代碼并不考慮副作用,所以較難優化,而且不能重用。
綜合考慮基于 SQL 的語言以及程序語言,我們設計出了 U-SQL,他用 C# 編寫,具備聲明性 SQL 語言原生的可擴展性,又對其進一步擴展。集各種范式于一身,集結構化,非結構化,遠程數據處理于一身,集聲明式以及定制化命令編程于一身,集語言擴展能力于一身。
U-SQL 構建在微軟的 SCOP 經驗以及其他語言例如 T-SQL,ANSI SQL 以及 Hive 的基礎之上。例如,我們對 SQL 和編程語言的集成,執行以及對 U-SQL 框架的優化都基于 SCOPE,這使得每天可以運行成千上萬個作業。我們也會對調整系統元數據(數據庫,表等等),SQL 語法,T-SQL,ANSI SQL 等 SQL Server 用戶所熟悉的語言語義等支持,是的他們可以協同通過。 我們使用C#數據類型即表達式支持,這樣您可以在 SELECT 里無縫潛入 C# 謂詞及表達式,從而植入業務邏輯。最后,通過對 Hive 以及其他大數據語言數據模式,處理需求等研究,將其集成到我們的框架里。
簡言之,基于現有語言和經驗的 U-SQL 語言,有利于您簡單地處理復雜問題。
展示 U-SQL!
我們假設我已經下載了所有我的 推ter 歷史記錄,包括:我推送的,轉發的,提到的。并且作為一個 CSV 文件上傳到我的 Azure Data Lake Store。
在這里例子里,我知道我想要處理數據的結構,第一步我只想分組查詢出每個作者的推送數據的數量:
@t = EXTRACT date string , time string , author string , tweet string FROM "/input/My推terHistory.csv" USING Extractors.Csv(); @res = SELECT author , COUNT(*) AS tweetcount FROM @t GROUP BY author; OUTPUT @res TO "/output/My推terAnalysis.csv" ORDER BY tweetcount DESC USING Outputters.Csv();
上面的 U-SQL 腳本顯示了三個使用 U-SQL 處理數據的主要步驟:
-
提取。從你的源數據中提取數據。 簡單的說就是使用 EXTRACT 申明查詢,概述數據。申明的數據類型基于 C# 的數據類型,這里我使用了內置的 Extractors 類庫去讀取和schematize(系統化) CSV 文件。
</li> -
轉換。使用 SQL 并且(或者)用戶自定義操作 (你可以轉換為其他時間)。在上面的例子中, 使用了一個常見的 SQL 表達式,做了一個 GROUP BY 聚合操作。
</li> -
輸出。結果既可以是文件,也可以輸出到一個 U-SQL 表格保存在內存中用作后續的處理。
</li> </ol>注意 U-SQL 的 SQL 關鍵字和 C# 的語法表達式的區別是使用大寫來提供語法區別,可能兩者是一樣的,但是如果大寫就是 U-SQL 的關鍵字,他們的文字一樣但是可能有不同的意義。
還要注意每個表達式分配了一個變量 (@t , @res)。允許 U-SQL 通過一步步的表達式(增量表達式流),遞增的轉換和編譯數據,增量表達式是使用函數式 lambda 表達式組成(與 Pig 語言類似)。執行框架,并且編譯所有的表達式為一個的表達式。這個表達式可以是全局最優化,所以擴展的方式不可能是逐行執行表達式。下面的圖標通過向你顯示圖表的方式,顯示在這篇博文中的下一個查詢:
回到我們的例子,我現在想要添加額外的信息:關于推文中提及的人,并且擴展我的聚合去返回在我的 tweet 網中出現的頻率,還有他們的推文中提及我的頻率。因為我可以使用 C# 去操作數據,所以我可以使用 C#LINQ 表達式擴展一個 ARRAY。這時我把得到的數組使用 EXPLODE 傳入數據集,并且使用 CROSS APPLY 操作應用 EXPLODE 到每條數據。我使用 UNION 操作聯合作者,但是需要使用@重新給變量賦值。
這里使用另外一個C#表達式(這里我使用了substring從第一位開始取數據-翻譯認為應該是排除@符的意思) .
@t = EXTRACT date string , time string , author string , tweet string FROM "/input/My推terHistory.csv" USING Extractors.Csv(); @m = SELECT new SQL.ARRAY<string>( tweet.Split(' ').Where(x => x.StartsWith("@"))) AS refs FROM @t; @t = SELECT author, "authored" AS category FROM @t UNION ALL SELECT r.Substring(1) AS r, "mentioned" AS category FROM @m CROSS APPLY EXPLODE(refs) AS Refs(r); @res = SELECT author , category , COUNT(*) AS tweetcount FROM @t GROUP BY author, category; OUTPUT @res TO "/output/My推terAnalysis.csv" ORDER BY tweetcount DESC USING Outputters.Csv();
下一步,我可以使用 Visual Studio 的 Azure 數據湖工具里的代碼轉換功能將 C# 代碼重構成 C# 函數。提交腳本后,系統會將代碼自動部署到服務器上。
我們也可以在U-SQL元數據目錄里部署和注冊代碼集。這樣,我們或者其他人可以不時重用這組腳本。以下例子表示了,在代碼集注冊為TweetAnalysis之后,如何找到函數。
REFERENCE ASSEMBLY TweetAnalysis; @t = EXTRACT date string , time string , author string , tweet string FROM "/input/My推terHistory.csv" USING Extractors.Csv(); @m = SELECT Tweets.Udfs.get_mentions(tweet) AS refs FROM @t; @t = SELECT author, "authored" AS category FROM @t UNION ALL SELECT Tweets.Udfs.cleanup_mentions(r) AS r, "mentioned" AS category FROM @m CROSS APPLY EXPLODE(refs) AS Refs(r); @res = SELECT author , category , COUNT(*) AS tweetcount FROM @t GROUP BY author, category; OUTPUT @res TO "/output/My推terAnalysis.csv" ORDER BY tweetcount DESC USING Outputters.Csv();
由于之前提到了除了刪除@標識符之外,還想要對 mentions 做其他清理工作,所以該代碼集還包含了一個 cleanup_mentions 函數,用來在刪除@之后做其他處理。
為什么選擇U-SQL
通過上述介紹,希望您已經窺測到了我們對 U-SQL 的想法,以及 U-SQL 是如何將查詢以及大數據處理變得簡單的。接下來的幾周里,我們會進一步介紹該語言的設計邏輯,并會給出一些示例代碼即應用場景,請參見Azure 博客大數據專題。我們會深入探討一下特性:
-
通過模式匹配操作文件集合
</li> -
使用(分區)表
</li> -
對 SQL Azure 數據庫進行聯邦查詢
</li> -
將 U-SQL 代碼封裝為視圖,表型數據函數,過程
</li> -
SQL 窗體函數
</li> -
使用C#編寫用戶定義操作(定制抽取,處理過程)
</li> -
復合類型(MAP,ARRAY)
</li> -
使用 U-SQL 樹立數據管道
</li> -
U-SQL 對物聯網分析中lambda架構的支持
</li> </ul>U-SQL 將大數據處理變得簡單:
-
統一了聲明行查詢語言與復雜代碼
</li> -
統一了結構化查詢與非結構化數據
</li> -
統一了本地和遠程查詢
</li> -
一旦上線,即可提高生產力和敏捷性
</li> </ul>不只是 U-SQL - Auzre 數據湖為您的所有數據創建生產力
我們旨在將 Azure 數據湖建立成最有用的集編寫,調試和優化各種規模數據功能的強大工具,U-SQL只是其中一個環節。通過對編寫與監控 Hive 作業的全面支持, 我們開發了基于 C# 的編碼模型,他可以創建用于流處理的 Storm 作業,而且從創建,到執行,支持作業生命周期的每一階段。Azure 數據湖使得您可以專心于業務邏輯而不是調試分布式環境。我們的目標就是將大數據技術變得更加簡單,被更多數人使用:大數據專家,工程師,數據科學家,分析師以及應用開發人員。
-
-
-