天天看點

大資料處理語言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介紹

<a></a>

如果你分析了的大資料分析的特點,就會很容易的産生一些有關易用性的需求,一個功能強大的語言應該:

可以處理任何類型的資料。例如從安全日志中分析僵屍網絡(botnet)攻擊模式,通過機器學習來提取圖像和視訊中的特征,這種語言需要允許你操作任何類型的資料。

使用自定義的代碼很容易地表現複雜的(經常是表現某公司自營業務的)算法。舉例來說,基礎的查詢語言通常不易表達自定義的過程,從使用者定義的函數到他們自定義的輸入輸出格式都是如此。

對任何尺度的資料進行有效的縮放,你無須再關心擴充拓撲(scale-out topology)、管道代碼或特定分布式基礎設施的限制。

現有的大資料語言該如何處理這些需求?

基于 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 語言,有利于您簡單地處理複雜問題。

我們假設我已經下載下傳了所有我的 twitter 曆史記錄,包括:我推送的,轉發的,提到的。并且作為一個 csv 檔案上傳到我的 azure data lake store。

大資料處理語言U-SQL介紹

在這裡例子裡,我知道我想要處理資料的結構,第一步我隻想分組查詢出每個作者的推送資料的數量:

大資料處理語言U-SQL介紹

上面的 u-sql 腳本顯示了三個使用 u-sql 處理資料的主要步驟:

提取。從你的源資料中提取資料。 簡單的說就是使用 extract 申明查詢,概述資料。申明的資料類型基于 c# 的資料類型,這裡我使用了内置的 extractors 類庫去讀取和schematize(系統化) csv 檔案。

轉換。使用 sql 并且(或者)使用者自定義操作 (你可以轉換為其他時間)。在上面的例子中, 使用了一個常見的 sql 表達式,做了一個 group by 聚合操作。

輸出。結果既可以是檔案,也可以輸出到一個 u-sql 表格儲存在記憶體中用作後續的處理。

注意 u-sql 的 sql 關鍵字和 c# 的文法表達式的差別是使用大寫來提供文法差別,可能兩者是一樣的,但是如果大寫就是 u-sql 的關鍵字,他們的文字一樣但是可能有不同的意義。

還要注意每個表達式配置設定了一個變量 (@t , @res)。允許 u-sql 通過一步步的表達式(增量表達式流),遞增的轉換和編譯資料,增量表達式是使用函數式 lambda 表達式組成(與 pig 語言類似)。執行架構,并且編譯所有的表達式為一個的表達式。這個表達式可以是全局最優化,是以擴充的方式不可能是逐行執行表達式。下面的圖示通過向你顯示圖表的方式,顯示在這篇博文中的下一個查詢:

大資料處理語言U-SQL介紹

回到我們的例子,我現在想要添加額外的資訊:關于推文中提及的人,并且擴充我的聚合去傳回在我的 tweet 網中出現的頻率,還有他們的推文中提及我的頻率。因為我可以使用 c# 去操作資料,是以我可以使用 c#linq 表達式擴充一個 array。這時我把得到的數組使用 explode 傳入資料集,并且使用 cross apply 操作應用 explode 到每條資料。我使用 union 操作聯合作者,但是需要使用@重新給變量指派。

這裡使用另外一個c#表達式(這裡我使用了substring從第一位開始取資料-翻譯認為應該是排除@符的意思) .

大資料處理語言U-SQL介紹

下一步,我可以使用 visual studio 的 azure 資料湖工具裡的代碼轉換功能将 c# 代碼重構成 c# 函數。送出腳本後,系統會将代碼自動部署到伺服器上。

大資料處理語言U-SQL介紹

我們也可以在u-sql中繼資料目錄裡部署和注冊代碼集。這樣,我們或者其他人可以不時重用這組腳本。以下例子表示了,在代碼集注冊為tweetanalysis之後,如何找到函數。

大資料處理語言U-SQL介紹

由于之前提到了除了删除@辨別符之外,還想要對 mentions 做其他清理工作,是以該代碼集還包含了一個 cleanup_mentions 函數,用來在删除@之後做其他處理。

通過模式比對操作檔案集合

使用(分區)表

對 sql azure 資料庫進行聯邦查詢

将 u-sql 代碼封裝為視圖,表型資料函數,過程

sql 窗體函數

使用c#編寫使用者定義操作(定制抽取,處理過程)

複合類型(map,array)

使用 u-sql 樹立資料管道

u-sql 對物聯網分析中lambda架構的支援

u-sql 将大資料處理變得簡單:

統一了聲明行查詢語言與複雜代碼

統一了結構化查詢與非結構化資料

統一了本地和遠端查詢

一旦上線,即可提高生産力和靈活性

不隻是 u-sql – auzre 資料湖為您的所有資料建立生産力

我們旨在将 azure 資料湖建立成最有用的集編寫,調試和優化各種規模資料功能的強大工具,u-sql隻是其中一個環節。通過對編寫與監控 hive 作業的全面支援, 我們開發了基于 c# 的編碼模型,他可以建立用于流處理的 storm 作業,而且從建立,到執行,支援作業生命周期的每一階段。azure 資料湖使得您可以專心于業務邏輯而不是調試分布式環境。我們的目标就是将大資料技術變得更加簡單,被更多數人使用:大資料專家,工程師,資料科學家,分析師以及應用開發人員。

本文作者:佚名

來源:51cto