Watson QueryでJSONファイルを仮想化する


# 1 前提事項

JSON を保管する IBM Cloud Object Storage は既にデータソースとして登録済みであること。
参考：[Watson QueryでIBM Object Storage上のCSVファイルを仮想化する](https://qiita.com/nishikyon/items/2577697c99464703e984) 「2-1 データソースの追加」を参照



# 2 JSONファイルのフォーマット

JSONファイルを扱う上での注意事項として、
 1. 拡張子は .json であること
 2. 文字エンコードが UTF-8 であること

この他に、[JSON Lines](https://jsonlines.org) 形式である必要があります。

以下に、サンプルのJSONを添付します。

```
{ "name" : "Nobuhiko Watanabe", "product_id" : "12345", "price" : 23.45, "shipTo" : "1-1, Mihama-ku Nakase, Chiba-shi"}
{ "name" : "Nobuo Takano", "product_id" : "12346", "price"  : 23.45, "shipTo" : "19-21, Nihonbashi Hakozaki-cho, Chuo-ku"}
```
# 3 JSONファイルのアップロード

作成してサンプルファイルを 「1 前提事項」で設定したS3 のバケットにアップロードします。
ICOSへのファイルのアップロードは、ブラウザで IBM Cloud にログイン後、該当のCloudObjectStorageインスタンスに入り、JSON用のバケットを作成して上で、アップロードしてください。


参考：[IBM Cloud Object Storage(ICOS)にCLI(ibmcloudコマンド)を用いてファイルアップロードする](https://qiita.com/takanobu_kawaguchi/items/90ed22c5a2852fb3b9d5)

# 4 IBM Object Storage上のJSON ファイルを仮想化

いよいよ、JSONファイルを仮想化します。

手順は、[Watson QueryでIBM Object Storage上のCSVファイルを仮想化する](https://qiita.com/nishikyon/items/2577697c99464703e984#:~:text=2%2D2.-,%E4%BB%AE%E6%83%B3,-%E5%8C%96)の「2-2. 仮想化」と同じです。異なるのは、対象ファイルがCSVでは無くJSONになることです。

## 4-1　JSONファイルの選択とプレビュー
本稿では、[Watson QueryでIBM Object Storage上のCSVファイルを仮想化する「3. フォルダ名をクリック」](https://qiita.com/nishikyon/items/2577697c99464703e984#:~:text=3.-,%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC,-%E5%90%8D%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF)部分との差分を添付します。

先程作成したJSONファイルは、JSONTESTフォルダに格納されています。
![フォルダ選択 2023-06-25 14.01.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/ca0edcc4-6194-1fcf-ff79-a5231e6af033.png)
このフォルダをクリックするとフォルダ内の最初のファイルがプレビューされます。
![ファイルプレビュー 2023-06-25 14.00.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/b089c5aa-f450-780c-4e89-30e3c4bc30e8.png)
対象となるファイルは、「WQSAMPLEJSON.json」ファイルで、データが無事読み込まれていることがわかります。

注：JSONファイルの形式に問題があると、プレビューの時点でエラーになります。

以下の内容のファイルをプレビューした場合には、以下のエラーメッセージが表示されます。
```
[ "name" : "Nobuhiko Watanabe", "product_id" : "12345", "price" : 23.45, "shipTo" : "1-1, Mihama-ku Nakase, Chiba-shi"]
[ "name" : "Nobuo Takano", "product_id" : "12346", "price"  : 23.45, "shipTo" : "19-21, Nihonbashi Hakozaki-cho, Chuo-ku"]
```

![JSON_ERROR 2023-06-25 14.33.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/e473fd5a-4247-8cfd-8dc9-6656f2106323.png)

上記のファイルは、「 { } 」 となっているべきところが、「 [ ] 」となっていたため、JSONとして処理出来なかったことがわかります。


## 4-2 JSONファイルの仮想化
プレビューが成功したら、仮想化を行います。

![カートへ登録 2023-06-25 14.11.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/50f780e2-5c38-8f5d-467e-4a5cd2d60f81.png)

「列ヘッダーに最初の行を使用する」にチェックを入れて、「カート追加」ボタンをクリックします。
　
![カート登録完了2023-06-25 14.13.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/565716ee-8748-bd26-368a-baafc12e3cbe.png)

カートへの追加が成功したので、「カートの表示」ボタンをクリックします。

## 4-3 カートの確認と表の仮想化

カートの追加された仮想化対象の一覧が表示されます。
![ カートの確認と仮想化2023-06-25 14.17.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/c33c4a3a-0366-2713-c9b8-3ab9f1fcb400.png)
ここでは、「プロジェクトに割り当て」する（するならプロジェクトの指定）か否かの確認、「カタログに公開」するか否かの確認、最後に仮想化する際のテーブル名やスキーマの指定を行います。
記載内容に問題がなければ、「仮想化」ボタンをクリックします。

クリック後、以下のメッセージが表示されます（本稿記載時は英語となっていますが、ご利用の際には日本語になっているかもしれません）。
![仮想化処理の開始 2023-06-25 14.22.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/27caa9d2-a970-9083-f27e-ed607b45e7da.png)

「Got to virtualized data」をクリックして「仮想化データ」に移動します。

![仮想化データ一覧 2023-06-25 14.26.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/a153e307-fb9d-3c35-d34a-10aa790fdc43.png)

「仮想化データ」移動後、しばらくすると、「Virtualization Status」が 「Success」 になれば成功です。


# （おまけ）ネストしたJSONファイルの取り込みについて

JSONファイルだと、ネストした記載方法が使われますが、Watson Query で処理した場合にどうなるかを確認してみました。

サンプルファイルは以下のとおりです。
```
{ "name" : "Nobuhiko Watanabe", "order":["books", "CDs"]}
{ "name" : "Nobuo Takano", "order":["books", "Games"]}
```
order のところがネストしているのがわかります。

仮想化画面のプレビューではこのように表示されます。
![ネストプレビュー2023-06-25 14.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/2333c28e-b71f-6472-ba0d-93581b0d2089.png)
order が列となり、["books", "CDs"]として値が格納されます。
さらに、カートに入れて仮想化処理を行います。

![仮想化実行 2023-06-25 14.55.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/dd69ce7f-6543-66d4-d89a-b76c1e10ca27.png)

「仮想化」ボタンをクリックします。

![仮想化成功2023-06-25 14.55.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/fde4dd56-3620-56f6-608f-660830e16ee4.png)

「仮想化データ」に移動すると、「Success」と表示されます。

仮想化ができたと思われるので、「詳細の表示」を実行します。
![プレビュー失敗2023-06-25 14.59.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/f5e7e316-9405-f94a-d3be-72533262d781.png)

以下のエラーメッセージが表示されました。
![エラー 2023-06-25 15.00.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/e0b6a2fc-d66c-ec83-5794-17f9552e4f2f.png)

「"ARRAY" data type is not supported....」 となるので、配列とみなされてエラーになります。

ネストしたJSONファイルの読み込みは、出来ないと考えた方が良さそうです。