Azure Function 轉拋 Blob Table 資料到Azure SQL DB

Edward Kuo
Apr 19 · 6 min read
Image for post
Image for post

Blob Table是一個簡單且便宜在儲存非結構化資料的好用服務,不過,如果要針對這些資料進行有結構化且又是大量資料的分析查詢或是計算下,且想要讓團隊也能在熟悉工具能夠快速發揮效益,還是使用SQL Database會相對簡易些。

因此,既然是屬於彙整或是分析類型的資料,就可以透過Azure Function定時從Blob Table取出需要分析的欄位,匯入到SQL DB就可以。

前期設定

要讀取Blob Table,我們需要引用這個 Microsoft.Azure.Cosmos.Table SDK,並且建立要存取Blob Table的Data Model。而建立的Data Model,必須要繼承TableEntity才可以,不然,到時候從Blob Table抓到的資料是無法被Mapping到Model的

然後,取得Blob Table的連線金鑰,做為Blob Table連線字串。

Image for post
Image for post

撰寫程式

前期準備就緒後,整體的邏輯架構,可以分為四階段

  • Azure Function 組合出要抓取Blob Table資料的查詢字串

下方為前兩步驟的程式碼

  • _depanelBlobTableConnection : Blob Table的連線字串,可以從Blob 存取金鑰得到

這一段TableQuery<ProductModel> query = new TableQuery<ProductModel>(); 主要就是要將查詢回來的資料轉換成Data Model,當然在這裡的Model內的屬性設定名稱必須與Blob Table欄位名稱必須完全相符,不然資料會Mapping不到

接下來重點是 query.FilterString 就是這一段,在官方文件中,可以透過C#搭配SDK方式撰寫查詢的Linq語法去跟Blob Table做查詢。類似下面這樣

IQueryable<CustomerEntity> linqQuery = table.CreateQuery<CustomerEntity>()
.Where(x => x.PartitionKey == “4”)
.Select(x => new CustomerEntity() { PartitionKey = x.PartitionKey, RowKey = x.RowKey, Email = x.Email });

不過操作起來,在某些方面卻感覺不很順手,尤其,其中案例是需要做到資料轉型方面的部分,用上述方式,怎樣就會無法查詢成功,舉例來說:日期在Blob Table類的資料型態有的會是String,有的是會是Datetime,如果直接傳入往往會被參數會被當作String處理,因此,遇到是Datetime型態欄位就會查無資料。

因此,我這邊做法會比較喜歡透過Query String進行查詢。一方面可以先在Azure Storage Explorer先練習把資料查詢確認好,然後,Azure Storage Explorer可以視覺化的查詢條件,轉換成Query String

Image for post
Image for post

如下圖,只要把下面的查詢字串,再放到程式內,做為查詢條件就可以

Image for post
Image for post

所以,下面這一行,就是這樣產生出來的。

query.FilterString =$”EventEnqueuedUtcTime ge datetime’{_blobTableEventProcessedUtcTimeStart}’ and EventEnqueuedUtcTime lt datetime’{_blobTableEventProcessedUtcTimeEnd}’”;

此外,就是要開始進行資料查詢ExecuteQueryAsync ,資料查詢部分,Blob Table一次只會讓你查詢1000筆資料,但是實際上資料不可能會這樣少,所以,我們必須不斷查詢到資料分頁都做完才可以進行停止,為此這樣,需要再額外寫一段關於查詢的Function

透過Do…While方式不斷讀取到查詢資料結束為止,另外,如果要一次把所有資料都讀取完畢,可以透過items.AddRange(seg) 匯集完所有資料一次,一次取出做整理後再匯入資料庫。當然,如果擔心這樣資料量過大,也可以批量進行處理。如程式碼中有一段是

new toDB().InsertErrorData(datacontext);

就可以每一千筆取出後,整理資料完畢,再把資料塞入到SQL DB內,那種方式比較好,就必須要依照情況來決定了。

以上就可以完成步驟1~3,最後,把資料塞入DB部分,就跟一般寫SQL DB的Insert一樣,只要把資料塞入到資料庫就可以。

參考資料

EK.Technology Learn

Design,Thinking,Coding & have fun every thing

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store