CData Software Blog

クラウド連携のCData Software の技術ブログです。

CData Power BI Connector でカスタムスキーマを利用する場合の注意点

f:id:sugimomoto:20211014101303p:plain

こんにちは。CData Software Japanリードエンジニアの杉本です。

今回は Power BI Connector でカスタムスキーマを利用する場合に遭遇する可能性があるエラーおよびその回避策について紹介したいと思います。

発生するエラーおよび条件について

まず、遭遇する可能性がある条件およびエラー内容について確認しておきましょう。

これはCData Power BI Connectorを使って、「カスタムスキーマ」を利用しており、かつ「オンプレミスデータゲートウェイ」を使ってPower BI Serviceにレポート・データセットをパブリッシュ、その後データセットを更新しようとした場合に発生します。

www.cdata.com

f:id:sugimomoto:20211014100936p:plain

www.cdatablog.jp

発生するエラーは主に2種類です。

以下のようにPower BI Service上でデータセットを更新しようとして、以下のようにアラートが出ます。

f:id:sugimomoto:20211014100942p:plain

ここで「基になるエラー メッセージ テーブルに表示可能な列がなく、照会できません。」というエラー

f:id:sugimomoto:20211014100946p:plain

もしくは「データ ソース エラーThe 'instock_changed(特定のカラム名になります)' column does not exist in the rowset.」というエラーです。

f:id:sugimomoto:20211014100951p:plain

この問題で奇妙な点は「Power BI Desktop」では正常に読み取れてしまうというところです。

f:id:sugimomoto:20211014100956p:plain

原因について

このエラーメッセージが発生する原因は内部的に生成しているカスタムスキーマファイルが読み取れない場合に発生します。

カスタムスキーマファイルは接続設定の「%APPDATA%\CData\MongoDB Data Provider\Schema」に生成・読み取りされるようになっており

f:id:sugimomoto:20211014101001p:plain

以下のような拡張子が「.rsd」ファイル形式のXMLで定義されているものです。

f:id:sugimomoto:20211014101005p:plain

<api:script xmlns:api="http://apiscript.com/ns?v1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:other="http://apiscript.com/ns?v1">

  <api:info title="fruits" desc="This rsd file is generated by MongoDB driver." other:tabletype="TABLE">
    <!-- You can modify the name, type, and column size here.  The name must match the values in the api:script block below -->
    <attr name="_id" xs:type="string" key = "true" columnsize = "2000" readonly = "false" isNullable = "false" other:datasourcedatatype = "bson:ObjectId" other:bsonpath = "$._id"/>
    <attr name="code" xs:type="string" columnsize = "2000" readonly = "false" isNullable = "true" other:datasourcedatatype = "string" other:bsonpath = "$.code"/>
    <attr name="name" xs:type="string" columnsize = "2000" readonly = "false" isNullable = "true" other:datasourcedatatype = "string" other:bsonpath = "$.name"/>
    <attr name="price" xs:type="int" columnsize = "4" precision = "10" readonly = "false" isNullable = "true" other:datasourcedatatype = "integer" other:bsonpath = "$.price"/>
    <attr name="instock_changed" xs:type="int" columnsize = "4" precision = "10" readonly = "false" isNullable = "true" other:datasourcedatatype = "integer" other:bsonpath = "$.instock"/>
  </api:info>

  <api:set attr="collection" value="fruits"/>
  <api:set attr="schema" value="test"/>
</api:script>

そして、この「%APPDATA%\CData\MongoDB Data Provider\Schema」に含まれる「%APPDATA%」パスなのですが、これはPower BI Connectorの実行ユーザーによって動的に切り替わってしまいます。

Power BI DesktopでCData Power BI Connectorを利用する場合は、Power BI Desktopのユーザーが実行ユーザーとなるため、「C:\Users\{ユーザー名}\AppData\Roaming\CData\MongoDB Data Provider\Schema」を読み取るのですが

もし、以下のようにオンプレミスデータゲートウェイを使っている場合は、ゲートウェイサービスアカウントによって、実行されるため参照先のパスが変わってしまうのです。

f:id:sugimomoto:20211014101011p:plain

ちなみに私の環境だと「C:\Windows\ServiceProfiles\PBIEgwService\AppData\Roaming\CData\MongoDB Data Provider\Schema」が参照されてしまいます。

これにより参照するべきカスタムスキーマファイルが読み取れずに、Power BI Service上だけでエラーが発生します。

回避策について

回避策はシンプルです。以下の「Location」パスを絶対値パス(ないし任意の絶対値パス)に切り替えることで対応できます。

f:id:sugimomoto:20211014101023p:plain

例えば私の環境だと「C:\Users\sugim\AppData\Roaming\CData\MongoDB Data Provider\Schema」になります。

f:id:sugimomoto:20211014101028p:plain

これで改めてPower BI Service上でデータセットを更新すると、正常にデータが反映されます。

f:id:sugimomoto:20211014101032p:plain

カスタムスキーマについて

最後にちょっとだけカスタムスキーマというものについて解説しておこうと思います。

CData Power BI Connector のいくつかのデータソースでは「カスタムスキーマ」と呼ばれる独自のデータモデルを定義する機能が存在します。

これは例えば、「MongoDB」や「ElasticSearch」などNoSQL系のデータソースに接続する際によく利用されます。

www.cdata.com

f:id:sugimomoto:20211014101038p:plain

f:id:sugimomoto:20211014101044p:plain

通常NoSQL系のデータソースはCData Power BI Connectorがデータモデルとして扱いやすくするために、自動キーマ検出という機能を用いて、対象のNoSQLに外部からデータモデルを算出して当てはめます。

cdn.cdata.com

f:id:sugimomoto:20211014101049p:plain

しかしながら、ネストが深いデータやスキャン対象のデータに含まれていない場合、カスタムで調整する必要が出てくるため、前述のようなカスタムスキーマファイルを利用するシチュエーションがあります。

f:id:sugimomoto:20211014101053p:plain

このXMLファイルをカスタマイズすることで、表示したいカラムの追加やカラム名などの調整を柔軟に行うことができるようになっています。

おわりに

今回の事象の根幹は「%APPDATA%」パスが動的に変わるため発生する問題になっていました。

今回のようなケース以外にも異なるサービスがConnectorを利用する場合には類似の事象が発生する可能性があります。

もし気になるエラーなどが発生した場合には、どうぞお気軽にテクニカルサポートまで問い合わせしてみてください。

https://www.cdata.com/jp/support/submit.aspx