SBクラウド株式会社logo

MaxCompute連載8:JSONファイルをMaxComputeの内部テーブルに格納する

Hi, データエンジニアの大原です。
Alibaba Cloudのデータ処理プラットフォーム「MaxCompute」についての連載記事の8回目です。

今回はJSONファイルをMaxComputeの内部テーブルに格納する方法について説明します。

前回の記事はこちらをご覧ください。 www.sbcloud.co.jp

f:id:sbc_ohara:20210104091159p:plain

前書き

MaxComputeの概要をこのblogにて記載しました。

MaxCompute (旧プロダクト名 ODPS) は、大規模データウェアハウジングのためのフルマネージドかつマルチテナント形式のデータ処理プラットフォームです。さまざまなデータインポートソリューションと分散計算モデルにより、大規模データの効率的な照会、運用コストの削減、データセキュリティを実現します。

f:id:sbc_ohara:20210104133726p:plain

少し前になりますが、MaxComputeについての資料をSlideShareへアップロードしていますので、こちらも参考になればと思います。

www.slideshare.net

今回はAlibaba Cloud MaxComputeでJSONファイルを格納、SQL処理してみましょう。構成図で、こんな感じです。

f:id:sbc_ohara:20210314104120p:plain

今回はMovielensというオープンデータをJSONへ変換して使います。
注意として、MaxComputeはJSONデータを1つのString文字型として格納するため、JSONデータを少し加工する必要があります。
具体的には以下の通り、 開始の "[" と 終了の"]" を除外、{ ... }を1つのレコードとして格納するために、{ ... } , { ... } の間の"," を除去します。
※少し奇妙かもしれないですが、本家Apache Hiveも同じアプローチです。

{"movieId": "1", "title": "Toy Story (1995)", "genres": "Adventure|Animation|Children|Comedy|Fantasy"}
{"movieId": "2", "title": "Jumanji (1995)", "genres": "Adventure|Children|Fantasy"}
{"movieId": "3", "title": "Grumpier Old Men (1995)", "genres": "Comedy|Romance"}
{"movieId": "4", "title": "Waiting to Exhale (1995)", "genres": "Comedy|Drama|Romance"}
{"movieId": "5", "title": "Father of the Bride Part II (1995)", "genres": "Comedy"}
{"movieId": "6", "title": "Heat (1995)", "genres": "Action|Crime|Thriller"}
{"movieId": "7", "title": "Sabrina (1995)", "genres": "Comedy|Romance"}
{"movieId": "8", "title": "Tom and Huck (1995)", "genres": "Adventure|Children"}
{"movieId": "9", "title": "Sudden Death (1995)", "genres": "Action"}
{"movieId": "10", "title": "GoldenEye (1995)", "genres": "Action|Adventure|Thriller"}
{"movieId": "11", "title": "American President, The (1995)", "genres": "Comedy|Drama|Romance"}
{"movieId": "12", "title": "Dracula: Dead and Loving It (1995)", "genres": "Comedy|Horror"}
{"movieId": "13", "title": "Balto (1995)", "genres": "Adventure|Animation|Children"}
{"movieId": "14", "title": "Nixon (1995)", "genres": "Drama"}
{"movieId": "15", "title": "Cutthroat Island (1995)", "genres": "Action|Adventure|Romance"}
{"movieId": "16", "title": "Casino (1995)", "genres": "Crime|Drama"}
{"movieId": "17", "title": "Sense and Sensibility (1995)", "genres": "Drama|Romance"}
{"movieId": "18", "title": "Four Rooms (1995)", "genres": "Comedy"}
{"movieId": "19", "title": "Ace Ventura: When Nature Calls (1995)", "genres": "Comedy"}
{"movieId": "20", "title": "Money Train (1995)", "genres": "Action|Comedy|Crime|Drama|Thriller"}
{"movieId": "21", "title": "Get Shorty (1995)", "genres": "Comedy|Crime|Thriller"}
{"movieId": "22", "title": "Copycat (1995)", "genres": "Crime|Drama|Horror|Mystery|Thriller"}
{"movieId": "23", "title": "Assassins (1995)", "genres": "Action|Crime|Thriller"}
{"movieId": "24", "title": "Powder (1995)", "genres": "Drama|Sci-Fi"}
{"movieId": "25", "title": "Leaving Las Vegas (1995)", "genres": "Drama|Romance"}
{"movieId": "26", "title": "Othello (1995)", "genres": "Drama"}
{"movieId": "27", "title": "Now and Then (1995)", "genres": "Children|Drama"}
{"movieId": "28", "title": "Persuasion (1995)", "genres": "Drama|Romance"}

f:id:sbc_ohara:20210315132616p:plain


共通作業(MaxCompute全体で共通事項)

RAM ユーザー作成&権限付与

もしMaxComputeを操作するユーザがRAMユーザーの場合は以下を実施してください。

RAMより対象のユーザーを選定します。ユーザーが無い場合は新規作成します。 このときにAccessKey IDとAccessKey Secretをメモとして残してください。AccessKey IDとAccessKey SecretはDataWorks DataIntegrationの処理に必要となります。

f:id:sbc_ohara:20210305025953p:plain

対象のユーザーには権限ロールとしてAliyunDataWorksFullAccessをアタッチします。 これはDataWorksを操作するためのFull権限です。
DataWorks側にてユーザーごとに読み取り専用や一部プロジェクト・テーブルなどのきめ細かい権限付与ができますが、ここでは割愛します。

f:id:sbc_ohara:20210305025809p:plain

Workspace作成

MaxComputeを操作するためにはワークスペースおよびプロジェクトが必要なので新たに作成します。DataWorksコンソールから 「Create Project」を選択し、起動します。
Modeは「Basic Mode(基本モード)」「と「Standard Mode(標準モード)」の2種類があります。ここは「Basic Mode(基本モード)」として選定します。
基本モードと標準モードは過去記事にて説明しています。

f:id:sbc_ohara:20210304212211p:plain

続けて、MaxCompute を選定します。料金は初めて操作するなら Pay-As-You-Go(使った分だけ課金) が良いと思います。

f:id:sbc_ohara:20210304220348p:plain

MaxComputeに関する必要な情報を設定し、Workspaceを作成します。

f:id:sbc_ohara:20210304220459p:plain


JSONファイルを MaxCompute Tableへ格納 (Tunnelを使用)

ここのチュートリアルは、JSONファイルをMaxComputeの内部テーブルへ格納する方法です。   前回の記事:CSVファイルをMaxComputeの内部テーブルへ、、ではGUIベースで追加していたので、今回はTunnelを使います。
【MaxCompute連載】MaxComputeを支えるツール・TunnelおよびIntelliJ IDEAについて

www.alibabacloud.com

ちなみにJSONファイルも、CSVファイルと同様にデータを格納することができます。詳細は過去記事を参考にしてみてください。
【MaxCompute連載】CSVファイルをMaxComputeの内部テーブルに格納する
【MaxCompute連載】CSVファイルをMaxComputeの外部テーブルとして処理する

STEP1:データ格納

Workspace、Project作成直後は何もない状態と思います。
なので、まずはDataWorks のHomepageへ移動し、データを格納する準備を進めます。

f:id:sbc_ohara:20210304220751p:plain

DataWorksのコンソール画面です。今回はTunnelを使うので、「DataStdio」をクリックします。

f:id:sbc_ohara:20210304221122p:plain

DataStdio画面です。最初は何もない状態です。そこからプラレールのように色々構築することが出来ます。
f:id:sbc_ohara:20210304232016p:plain

STEP2:JSONファイルを認識し、MaxCompute Tableに格納

メニューバーからworkflowを作成します。

f:id:sbc_ohara:20210304232146p:plain

workflow名を入力し、「Create」ボタンで作成します。ここは「csv2maxcompute」というタイトルで登録します。

f:id:sbc_ohara:20210304232340p:plain

workflow画面が出たら、メニューバーにて、緑色の「Table」から「Create Table」でテーブルを新規作成します。
「csv2maxcompute」というワークフロー画面はタブより閉じても問題ありません。

f:id:sbc_ohara:20210305031323p:plain

external_oss_table_json という名前のテーブルを作成します。

Table名を入力して作成します。

f:id:sbc_ohara:20210314125032p:plain

DataStdio画面です。最初は何もない状態です。この状態からJSONデータを登録してみます。
f:id:sbc_ohara:20210314125455p:plain

JSONデータは1つのフィールドとして格納してから処理するので、「json_data」というフィールドを作成します。 f:id:sbc_ohara:20210315134548p:plain

Display/Nameを入力したら、Commitします。
f:id:sbc_ohara:20210315134944p:plain

STEP2:JSONファイルをMaxCompute TableにUpload

JSONファイルをMaxComputeに格納します。Tunnelを使います。
ファイルはTunnelが使えれば、ECSでもどこでも大丈夫です。今回、著者はローカルにJSONデータを保存しています。この状態から、tunnel コマンドでアップロードします。

tunnel upload C:/Users/1200358/Desktop/ml-latest-small-master/movieslite.json oss_target_table_json -fd ";";

f:id:sbc_ohara:20210315150211p:plain

STEP3:実行

DataWorks DataStdio画面に戻って、、TableにJSONデータが無事格納されたか確認しましょう。Ad-Hoc Query画面を開きます。

f:id:sbc_ohara:20210315135757p:plain

Ad-Hoc Query用のノードを作成します。

f:id:sbc_ohara:20210315135850p:plain

まずは、oss_target_table_jsonテーブルをそのまま表示してみます。   

select * from oss_target_table_json;

f:id:sbc_ohara:20210315145231p:plain

このように、1つのフィールドにJSONファイルが格納されたことがわかります。
これに対し、Selectサブクエリおよびget_json_object関数を使ってJSONデータを正しく表示します。

SELECT * FROM (
    SELECT 
        get_json_object(json_data, '$.movieId') as movieId,
        get_json_object(json_data, '$.title') as title,
        get_json_object(json_data, '$.genres') as genres
    FROM oss_target_table_json
)

f:id:sbc_ohara:20210315145526p:plain


JSONファイルを MaxCompute Tableへ格納 (OSSからSQLクエリを使用)

今度はOSSにあるJSONファイルをSQLクエリで格納してみましょう。 同じく、oss_target_table_jsonテーブルを使います。 先にTRUNCATE TABLEコマンドで、oss_target_table_jsonテーブルのデータを空にします。 ※注意として、MaxComputeは「DELETE」をサポートしません。なので、全てのレコードを削除したい場合は、DELETEの代わりにTRUNCATE TABLEを入れて全てのレコードを削除します。

TRUNCATE TABLE ratings;

www.alibabacloud.com

STEP1: 事前準備 OSSにて、JSONファイルを以下のどおりに格納します。
OSSはbucket名bigdata-dwh、ディレクトリ(Object Name Prefix)はjson/、jsonフォルダに対象のjsonファイルを格納しています。

注意点として、MaxComputeでLOAD OVERWRITE TABLEによるSQLでのテーブル格納時は、対象のjsonファイルをディレクトリ単位で管理する必要があります。

f:id:sbc_ohara:20210315151823p:plain

RAMロール画面を開いて、AliyunODPSDefaultRoleを検索します。

f:id:sbc_ohara:20210315152135p:plain

RAMロールからAliyunODPSDefaultRoleのARNをコピーします。

f:id:sbc_ohara:20210315152214p:plain

STEP2: SQLクエリで格納 上記、準備が完了したら、DataWorks DataStdioのAd-Hock Query画面にて、以下SQLクエリを入力します。

LOAD OVERWRITE TABLE hands_on_workspace.oss_target_table_json 
FROM 
LOCATION 'oss://<Access key ID>:<AccessKey Secret>@oss-apnortheast-1.aliyuncs.com/bigdata-dwh/json/'
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
WITH WITH SERDEPROPERTIES (
    'odps.properties.rolearn' = 'acs:ram::5536281650763903:role/aliyunodpsdefaultrole'
)
STORED AS TEXTFILE;

f:id:sbc_ohara:20210315153431p:plain

STEP3:完了

Tableが無事格納できたと思うので、確認します。
先ほどと同じように、Selectサブクエリおよびget_json_object関数を使ってJSONデータを正しく表示します。

SELECT * FROM (
    SELECT 
        get_json_object(json_data, '$.movieId') as movieId,
        get_json_object(json_data, '$.title') as title,
        get_json_object(json_data, '$.genres') as genres
    FROM oss_target_table_json
)

f:id:sbc_ohara:20210315153714p:plain

これでJSONファイルが正しく表示されてることが確認できました。


最後に

本記事では、JSONファイルをMaxCompute Tableとして格納する方法を簡単に説明しました。

最後までお読みいただきありがとうございました。

MaxCompute連載シリーズ

www.sbcloud.co.jp www.sbcloud.co.jp www.sbcloud.co.jp www.sbcloud.co.jp