MaxComputeでJSONデータの扱い方

こんにちは、Kouです。

まだご存じの方が少ないかと思いますが、DataWorks 2.0には、JSONデータへのサポートが強化され、JSONドキュメントの処理及び分析が楽となります。IoTやWebアプリケーションなど、さまざまなデータソースから出力するログの形式がJSONで、Log Serviceが収集したJSONデータをどのように加工するのかという質問が見えてくるので、今回の記事は、OSSへ事前にアップロードしたJSONドキュメントを例として、MaxComputeでJSONドキュメントの扱い方について、皆さんご紹介させて頂きたいと思います。

  • 事前準備

まず、JSONファイル(text.txt)をOSSへアップロードします。本記事は、次のJSON ドキュメントを使用します。

{
    "store": {
        "book": [
             {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
             },
             {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
             },
             {
                 "category": "fiction",
                 "author": "J. R. R. Tolkien",
                 "title": "The Lord of the Rings",
                 "isbn": "0-395-19395-8",
                 "price": 22.99
             }
          ],
          "bicycle": {
              "color": "red",
              "price": 19.95
          }
    },
    "expensive": 10
}
  • JSONドキュメントの同期

まず、Data Integrationを通して、新たなデータソース(OSS)を追加します。本記事は、OSSのバケットとDataWorksプロジェクトが同じリージョンに設定しましたので、OSSのイントラネットエンドポイントを使いました。

次は、下記のMaxComputeSQL文で、JSONドキュメントを格納するテーブルを作成します。また、DataStudioでデータ同期のタスクを新規作成します。

DROP TABLE IF EXISTS json_tab;
CREATE TABLE json_tab (data_oss STRING);

続いて、データ同期タスクで、下記の手順でデータソース、ターゲットとフィールドマッピングを設定します。

最後、JSON ドキュメントが 1 行で構成されている必要がありますので、JSON ドキュメントの平坦化をする為に、上記の赤枠のタブをクリックして、スクリプトモードに変換します。スクリプトファイルのうち、"fileFormat"の項目に「text」との値を「binary」に書き換えます。そうすると、JSONデータがjson_tabテーブルの一行の文字列になります。

{
    "type": "job",
    "steps": [
        {
            "stepType": "oss",
            "parameter": {
                "fieldDelimiterOrigin": "^",
                "nullFormat": "",
                "compress": "",
                "datasource": "oss",
                "column": [
                    {
                        "name": 0,
                        "index": 0,
                        "type": "string"
                    }
                ],
                "skipHeader": "false",
                "encoding": "UTF-8",
                "fieldDelimiter": "^",
                "fileFormat": "binary",
                "object": [
                    "test_1.txt"
                ]
            },
            "name": "Reader",
            "category": "reader"
        },
        {
            "stepType": "odps",
            "parameter": {
                "partition": "",
                "truncate": true,
                "datasource": "odps_first",
                "column": [
                    "data_oss"
                ],
                "emptyAsNull": false,
                "table": "json_tab"
            },
            "name": "Writer",
            "category": "writer"
        }
    ],
    "version": "2.0",
    "order": {
        "hops": [
            {
                "from": "Reader",
                "to": "Writer"
            }
        ]
    },
    "setting": {
        "errorLimit": {
            "record": ""
        },
        "speed": {
            "throttle": false,
            "concurrent": 2,
            "dmu": 1
        }
    }
}

下図のように、「select * from json_tab」の構文で、同期されたデータを簡単に確認することもできました。

  • JSONドキュメントの分析

MaxCompute には、ランタイム処理中に JSON クエリを実行できる get_json_object という組み込み UDF があります。 このメソッドでは 2 つの引数 (テーブル名とメソッド名) を取り、解析が必要なフラット化された JSON ドキュメントと JSON フィールドが含まれます。 この UDF の動作を確認する例を見てみましょう。

SELECT
  GET_JSON_OBJECT(json_tab.data_oss,'$.store.bicycle.color'),
  GET_JSON_OBJECT(json_tab.data_oss,'$.store.bicycle.price')
FROM json_tab;

  • 最後

いかがでしたでしょうか、実業務中でJSONドキュメントを扱うケースがよくあると思いますので、皆さんのお役に立てば幸いです。