MaxCompute は外部 API 操作を直接呼び出すことはできません。このチュートリアルでは、オフライン IP データベースとユーザー定義関数 (UDF) を使用して、MaxCompute で IP アドレスの地理位置情報を効率的に分析する方法を示す完全なケーススタディを提供します。
背景
MaxCompute はクローズドなコンピューティング環境であり、HTTP 経由で外部 API 操作 (Taobao IP データベース 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 を呼び出して MaxCompute テーブルで IP アドレスを検索し、その地理位置情報を取得する SQL 文を記述します。
準備
Data Studio パブリックプレビュー をオプトインしていない ワークスペース を作成します。このチュートリアルでは、[基本モード] の DataWorks ワークスペースを使用します。
ワークスペースに サーバーレスリソースグループ をバインドします。
ワークスペースに MaxCompute 計算リソースをバインド し、そのネットワーク接続をテストします。
ターゲットワークスペースで、ビジネスフローを作成 します。
手順
IP アドレスデータベースの準備
サンプルデータベース: ipdata.csv。
サンプルデータ構造:
データ形式は
UTF-8です。最初の 4 つのデータフィールドは、IP 範囲の開始アドレスと終了アドレスです。最初の 2 つは 10 進整数形式で、次の 2 つはドット区切り 10 進数形式です。
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 範囲の開始アドレス (ドット区切り 10 進数文字列形式、"1.0.1.x" など)。 end_ip_arg STRING, -- IP 範囲の終了アドレス (ドット区切り 10 進数文字列形式、"1.0.3.x" など)。 country STRING, -- 国名。 area STRING, -- エリア名 (通常は空または国と同じ)。 city STRING, -- 都市名 (一部のデータでは省の場合があります)。 county STRING, -- 地区/郡名。 isp STRING -- インターネットサービスプロバイダー (China Telecom、China Unicom、China Mobile など)。 );
アイコンをクリックしてコードを実行します。[パラメーター] ダイアログボックスで、バインドしたサーバーレスリソースグループを選択し、[実行] をクリックします。[MaxCompute 計算コストの見積もり] が完了するのを待ってから、[実行] をクリックします。
テーブルへのデータのアップロード
左上隅の
アイコンをクリックします。表示されたページで、 をクリックします。左のナビゲーションウィンドウで
アイコンをクリックします。[データのアップロード] をクリックします。次の表の説明に従ってパラメーターを設定します。
パラメーター
説明
アップロードするデータの指定
ファイルの選択
ipdata.csvファイルをアップロードします。宛先テーブルの設定
計算エンジン
MaxCompute
MaxCompute プロジェクト名
ターゲットの 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 アドレスの地理位置情報を検索するには、ドット区切り 10 進数 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 アドレスの場所を見つけることができます。