Help us understand the problem. What is going on with this article?

MaxComputeでJSONデータの扱い方

まだご存じの方が少ないかと思いますが、Alibaba Cloud 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ドキュメントを扱うケースがよくあると思いますので、皆さんのお役に立てば幸いです。

qfkdy
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした