MaxCompute は外部 API を直接呼び出すことができません。本チュートリアルでは、オフラインの IP データベースとユーザー定義関数(UDF)を使用して、MaxCompute 内で IP アドレスのジオロケーションを効率的に分析するための完全なケーススタディを紹介します。
背景情報
MaxCompute は閉じた計算環境であり、HTTP 経由で淘宝 IP データベース API のような外部 API を直接呼び出して IP ジオロケーションをリアルタイムでクエリすることはできません。MaxCompute で IP アドレスのジオロケーションを分析するには、以下の 3 つのソリューションが考えられます。
ソリューション | 実装方法 | メリット | デメリット | 結論 |
クエリのデータのエクスポート | 分析対象の IP アドレスを MaxCompute からローカルデバイスにエクスポートし、スクリプトで API を繰り返し呼び出してクエリを行います。 | シンプル | 効率が低く、API のレート制限(例:10 QPS)に制約されるため、大規模データには不向きです。 | 非推奨 |
ローカルデータベースでクエリ | IP データベースと分析対象の IP アドレスをローカルデバイスにダウンロードし、ローカルプログラムでマッチングを行います。 | API レート制限なし | データがデータウェアハウスから分離され、MaxCompute 内の他の業務データ(注文テーブルなど)と関連付けて分析できません。 | 非推奨 |
IP データベースをインポートしてクエリ | IP アドレスデータベース全体を MaxCompute テーブルにアップロードし、SQL 内で UDF を使用してクエリを行います。 |
| IP データベースを定期的に手動で更新する必要があります。 | 推奨 |
結論:3 番目のソリューションのみが、ビッグデータユースケースにおける高性能かつ高統合性の分析要件を満たすことができます。本チュートリアルでは、このソリューションの実装方法を詳しく説明します。
ソリューション概要
本ソリューションは、以下の 3 つの主要モジュールで構成されます。
データ準備:公開されている IP アドレスデータベースファイルを参照用として MaxCompute テーブルにアップロードします。
UDF 開発:文字列形式の IP アドレスを整数に変換する UDF を作成します。これは効率的な範囲マッチングに不可欠です。
SQL 分析:UDF を呼び出す SQL 文を記述し、MaxCompute テーブル内で IP アドレスを検索してジオロケーション情報を取得します。
事前準備
Data Studio(新バージョン)を有効化しないワークスペースを作成します。本チュートリアルでは、基本モードの DataWorks ワークスペースを使用します。
ワークスペースにサーバーレスリソースグループをバインドします。
MaxCompute コンピューティングリソースをワークスペースにバインドし、ネットワーク接続をテストします。
対象のワークスペースで、ビジネスフローを作成します。
操作手順
IP アドレスデータベースの準備
サンプルデータベース: ipdata.csv。
サンプルデータ構造:
データ形式は
UTF-8です。最初の 4 つのデータフィールドは IP 範囲の開始アドレスと終了アドレスです。最初の 2 つは 10 進数整数形式、次の 2 つはドット区切りの文字列形式です。
IP アドレスデータベースを MaxCompute にアップロード
テーブルを作成します。
DataStudio ページに移動します。
DataWorks コンソールにログインします。上部ナビゲーションバーで目的のリージョンを選択し、左側ナビゲーションウィンドウで を選択します。表示されたページで、ドロップダウンリストから目的のワークスペースを選択し、データ開発に移動 をクリックします。
DataStudio ページで、対象のビジネスフローを右クリックし、 を選択します。
ダイアログボックスで、エンジンインスタンス に事前に準備したコンピューティングリソースを選択し、名前を入力して 確認 をクリックします。
ノードエディターページで、以下のコードを入力します。
-- ipresource という名前のテーブルが既に存在する場合は、まず削除します。 DROP TABLE IF EXISTS ipresource; -- IP アドレスを格納するテーブルを作成します。 CREATE TABLE IF NOT EXISTS ipresource ( start_ip BIGINT, -- IP 範囲の開始アドレス(10 進数整数形式)。 end_ip BIGINT, -- IP 範囲の終了アドレス(10 進数整数形式)。 start_ip_arg STRING, -- IP 範囲の開始アドレス(ドット区切り文字列形式。例:"1.0.1.x")。 end_ip_arg STRING, -- IP 範囲の終了アドレス(ドット区切り文字列形式。例:"1.0.3.x")。 country STRING, -- 国名。 area STRING, -- エリア名(通常は空欄または国名と同じ)。 city STRING, -- 市名(一部のデータでは都道府県名の場合があります)。 county STRING, -- 区/郡名。 isp STRING -- インターネットサービスプロバイダー(例:中国電信、中国聯通、中国移動)。 );
アイコンをクリックしてコードを実行します。パラメーター ダイアログボックスで、バインド済みのサーバーレスリソースグループを選択し、実行 をクリックします。MaxCompute コンピューティングコストの見積もり が完了したら、実行 をクリックします。
データをテーブルにアップロードします。
左上隅の
アイコンをクリックします。表示されたページで、 をクリックします。左側ナビゲーションウィンドウで
アイコンをクリックします。データのアップロード をクリックし、以下の表に従ってパラメーターを設定します。
パラメーター
説明
アップロードするデータの指定
ファイルの選択
ipdata.csvファイルをアップロードします。送信先テーブルの設定
コンピュートエンジン
MaxCompute
MaxComputeProject 名
対象の MaxCompute プロジェクトを選択します。
送信先テーブル
ipresource テーブルを選択します。
重要新しく作成したテーブルが一覧に表示されない場合は、 に移動し、
odps.<project_name>.ipresourceのメタデータを手動でリフレッシュしてください。リソースグループ
事前に準備したサーバーレスリソースグループを選択します。
アップロードファイルのデータプレビュー
順序によるマッピング をクリックして、.csv ファイル内のデータを ipresource テーブルのフィールドにマッピングします。
データのアップロード をクリックします。
データが正常にアップロードされたことを確認します。
DataStudio ページの ODPS SQL ノードエディターに戻ります。以下の SQL クエリを実行します。データ行数とサンプルデータが表示されれば、アップロードは成功しています。
-- テーブル内のデータ行数をクエリします。 SELECT COUNT(*) FROM ipresource; -- 先頭 10 行のデータをプレビューします。 SELECT * FROM ipresource limit 10;
UDF の開発
SQL で IP アドレスのジオロケーションを検索するには、ドット区切りの IP 文字列(例:'1.0.2xx.4x')を比較可能な 10 進数整数に変換する UDF が必要です。
MaxCompute Python リソースを作成します。
DataStudio ページで、対象のビジネスフローを右クリックし、 を選択します。
ダイアログボックスで、
mc.pyのように名前を入力します。MaxCompute にアップロード を選択し、作成 をクリックします。ノードエディターページで、以下のコードを入力します。
from functools import reduce from odps.udf import annotate @annotate("string->bigint") class IPtoInt(object): def evaluate(self, ip): try: return reduce(lambda x, y: (x << 8) + y, map(int, ip.split('.'))) except: return 0
アイコンをクリックします。
MaxCompute UDF を作成します。
DataStudio ページで、対象のビジネスフローを右クリックし、 を選択します。
ダイアログボックスで、
ip2intのように名前を入力し、作成 をクリックします。これが UDF 名となり、作成後は変更できません。エディターページでパラメーターを設定します。主なパラメーターは以下のとおりです。
その他のパラメーターの詳細については、「MaxCompute 関数の登録」をご参照ください。
パラメーター
説明
関数タイプ
その他関数 のデフォルト設定を維持します。
クラス名
UDF を実装するメインクラスです。例:
mc.IPtoInt。説明リソースタイプが Python の場合、クラス名の形式は Python リソース名.クラス名 となります(リソース名の .py は不要です)。
リソース
前のステップで作成したリソースファイル
mc.pyを選択します。
アイコンをクリックして関数を保存します。
アイコンをクリックします。ダイアログボックスで変更内容を記述し、確認 をクリックします。
SQL を使用した IP ジオロケーションの検索
ODPS SQL ノードエディターに戻り、以下の SQL クエリを実行します。
-- 実際にクエリしたい IP アドレスに置き換えてください。 SELECT * FROM ipresource WHERE ip2int('1.0.2xx.4x') >= start_ip AND ip2int('1.0.2xx.4x') <= end_ip;
アイコンをクリックしてコードを実行します。パラメーター ダイアログボックスで、バインド済みのサーバーレスリソースグループを選択し、実行 をクリックします。MaxCompute コンピューティングコストの見積もり が完了したら、実行 をクリックします。実行結果を確認します。IP アドレスの位置情報が表示されます。