以前、SQL Server v.Next と SQL Database の BLOB ストレージからのローディングの新機能 という投稿を書きましたが、Azure Data Factory と組み合わせてみたいと思います。
現状の Data Factory ですが、プレビューではありますがデータコピーの機能が追加されています。
コピー アクティビティを使用したデータの移動
Azure Deep Dive の 現場ではこう使った ~Office 365 と Azure Functions、Azure Data Factory、Azure SQL Database, Power BI によるデータ収集と可視化~ でも紹介されていたようですが、コピーウィザードを使用することで、GUI でコピーの設定を行うことができます。
このコピーウィザードでは、Azure BLOB Storage をエクスポート先として指定することができます。
今回はエクスポート先として、Azure BLOB Storage を指定して、定期的にファイルを出力するようにしておきます。
Data Factory からの出力ですが、圧縮形式を指定することができ、SQL Server 2016 / SQL Database v12 で使用することができる GZip を選択することもできます。
出力する方式についても JSON を選択することができ、こちらも SQL Server の JSON 関数と組み合わせることができます。
SQL Server では、配列にしておいた方が操作しやすいですので、ファイルパターンについては配列としておきます。
これで設定は完了です。
Data Factory が実行されると、BLOB に gzip ファイルが出力されます。
デフォルトの定義では、出力されるファイル名は以下のようになっています。
"typeProperties": { "fileName": "[dbo].[REGION]", "folderPath": "datafactory", "format": { "type": "JsonFormat", "filePattern": "arrayOfObjects" }, "compression": { "type": "GZip", "level": "Fastest" } },
同一のファイル名として上書きが行われます。
実行のタイミングによって異なるファイルとして出力したい場合は、JSON を修正する必要があるかと。
Azure Data Factory – 関数およびシステム変数
Azure Data Factory を使用してオンプレミスのファイル システムとの間でデータを移動する
"typeProperties": { "fileName": "[dbo].[REGION]-{Year}{Month}{Day}{Hour}{Minute}.gzip", "folderPath": "datafactory", "format": { "type": "JsonFormat", "filePattern": "arrayOfObjects" }, "partitionedBy": [ { "name": "Year", "value": { "type": "DateTime", "date": "SliceStart", "format": "yyyy" } }, { "name": "Month", "value": { "type": "DateTime", "date": "SliceStart", "format": "MM" } }, { "name": "Day", "value": { "type": "DateTime", "date": "SliceStart", "format": "dd" } }, { "name": "Hour", "value": { "type": "DateTime", "date": "SliceStart", "format": "HH" } }, { "name": "Minute", "value": { "type": "DateTime", "date": "SliceStart", "format": "mm" } } ]
上記の JSON に変更すると、タイムスライスの開始の日付でファイルを出力することができます。
あとは、冒頭で紹介した BLOB ストレージとの連携機能で出力されたファイルにアクセスします。
以下のようなクエリで、gzip 圧縮されたファイルを直接アクセスすることも可能です。
# 圧縮を展開した際に先頭に数バイト不要なデータが入っているので削る処理を実施しています。
DECLARE @gzip varbinary(max) SELECT @gzip = BulkColumn FROM OPENROWSET( BULK 'datafactory/[dbo].[REGION]-201704021245.gzip', DATA_SOURCE = 'MyAzureBlobStorage', SINGLE_BLOB ) AS T1 DECLARE @json nvarchar(max) = (SELECT SUBSTRING(CAST(DECOMPRESS(@gzip) AS varchar(max)), CHARINDEX('[', CAST(DECOMPRESS(@gzip) AS varchar(max))), LEN(CAST(DECOMPRESS(@gzip) AS varchar(max))))) SELECT * FROM OPENJSON(@json) WITH( R_REGIONKEY int '$.R_REGIONKEY', R_NAME char(25) '$.R_NAME', R_COMMENT varchar(152) '$.R_COMMENT' )