3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Azure Synapse Link for Azure Cosmos DB に T-SQL 対応が来たので早速試してみる

Last updated at Posted at 2020-10-14

この記事について

Microsoft Ignite 2020 にてアップデート案内があった、T-SQL queries and real-time BI dashboards with Azure Synapse Link で、T-SQL での Azure Synapse Link 対応がパブリックプレビューに入ったので試してみます。

Cosmos DB へクエリ実行

Azure Synapse ワークスペースにログインします。
Azure Synapse ワークスペースの作成については、以下の記事を参照してください。

[Develop] 画面より、[SQL script] を選択します。

スクリーンショット 2020-10-15 3.57.36.png

[Connect to] で SQL on-demand が選択されていることを確認します。
[use database] は master のままで OK です。

スクリーンショット 2020-10-15 4.05.29.png

Cosmos DB はすでに作成してあるものを使用します。
Azure Synapse Link、および分析ストアは有効化してコンテナーを作成してください。

SELECT *
FROM OPENROWSET( 
  N'CosmosDB',
  N'account=<Cosmos DB アカウント名>;database=<Cosmos DB データベース名>;region=<リージョン名>;key=<プライマリまたはセカンダリのパスワード>',
  <Azure Synapse Link が有効化され、分析ストアが存在しているコンテナー名>) as XXX

regionですが、West US 2 の場合は westus2 と言った形で、小文字の方を使用します。
実際に取得してみた例がこちらです。

スクリーンショット 2020-10-15 5.03.18.png

Cosmos DB の分析ストアに対してクエリが発行され、データが取得できていることがわかります。
分析ストアを有効にしていない場合は、以下のようなエラーが出ます。データベース名やコンテナー名の誤りは別として、or analytical storage has not been enabled.というように、分析ストアへアクセスしようとしているのがわかります。

スクリーンショット 2020-10-15 5.05.36.png

わかったこと

カラム名はきちんと認識する

Cosmos DB 分析ストアにデータが ETL された際、スキーマ管理でカラム名がきちんと付与されているので、SELECT 句内できちんと識別できているようです。

スクリーンショット 2020-10-15 5.31.40.png

階層化されたデータだと扱いが面倒

Cosmos DB 側でデータが階層化されている場合、Synapse Link 経由で取得したデータは、2 階層以降のデータが JSON 文字列で返っています。

スクリーンショット 2020-10-15 6.29.57.png

Cosmos DB のデータはこんな感じです。

スクリーンショット 2020-10-15 6.27.59.png

NoSQL だからこそ、RDB とは違ったデータモデリングを求められ、JSON の階層構造には意識を向けているところだと思います。
Synapse Link で T-SQL 使えるようになったのは良いですが、このそのまま JSON 返ってきちゃう部分は注意しないとだめですね。

SQL プールの照合順序を変更しないと日本語データは文字化けする

先ほどの画像を見て分かる通り、Cosmos DB コンテナー内にある日本語の文字データが文字化けしています。

スクリーンショット 2020-10-15 5.08.20.png

Azure Synapse ワークスペースを West US 2 で作成しているから、SQL プール側で、いわゆる SQL Server の照合順序的なものが悪さをしているのでしょうかね。。気になるところです。
Spark の時は、問題なく取れたんですけどね。。フィードバックしておきました。

原因は、SQL プール (オンデマンド) の照合順序でした。Microsoft Docs にもきちんと記載がありました。

Synapse ワークスペースを作成した際、私の環境の master データベース (サーバーの)デフォルトの照合順序は SQL_Latin1_General_CP1_CI_AS になっていました。

スクリーンショット 2020-10-15 17.20.38.png

これでは日本語が文字化けしてしまいます。そのため、master ではない別のデータベースを作成し、照合順序を UTF8 に対応したものに設定して、再度実行してみます。

照合順序の変更
CREATE DATABASE synapse_demo_20201015
COLLATE Latin1_General_100_BIN2_UTF8;

これで作ったデータベースを使用して、再度実行すると、日本語も問題なく取得できるようになります。

スクリーンショット 2020-10-15 17.41.01.png

スクリーンショット 2020-10-15 17.36.51.png

なお。SQL プールの照合順序についての記載はこちら。

DECLARE 変数は使えない

Cosmos DB の接続文字列など、正直クエリに直接埋め込みたくはない気持ちがあります。
(もしかしたら私がミスしているかもしれませんが) DECLARE で変数化して OPENROWSET 使えるかなーと思って試してみましたが、やはりダメでした。
Microsoft Docs のように、クエリ本文にベタ書きするしか無いようです。
ここは、Spark 側では Linked Services に登録することで、接続文字列などを秘匿化できていたのもあり、少し残念ポイントです。

スクリーンショット 2020-10-15 5.24.13.png

引き続き、検証してわかったことはこちらに追記していく予定です。

参考資料


3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?