MaxCompute 向け Java SDK は、MaxCompute をプログラムで管理および操作するための一連の Java インターフェイスを提供します。この SDK を使用して、プロジェクトの管理、SQL ステートメントの実行、テーブルの操作、Tunnel を介したデータ転送、およびリソース・関数の管理が可能です。
SDK を通じて MaxCompute のコンピューティングおよびストレージサービスにアクセスした場合の課金は、他の方法でアクセスした場合と同様です。料金の詳細については、「ストレージ料金(従量課金)」「コンピューティング料金(従量課金)」「ダウンロード料金(従量課金)」をご参照ください。
SDK パッケージ
MaxCompute 向け Java SDK は、一連の Maven パッケージとして配布されます。
本トピックでは、MaxCompute の共通コアインターフェイスについて説明します。詳細については、「SDK JavaDoc」をご参照ください。
詳細については、「ストレージ料金(従量課金)」「コンピューティング料金(従量課金)」「ダウンロード料金(従量課金)」をご参照ください。
| パッケージ | 説明 |
|---|---|
odps-sdk-core |
コア機能:テーブルおよびプロジェクトの管理、Tunnel サービスへのアクセス |
odps-sdk-commons |
共通ユーティリティ |
odps-sdk-udf |
ユーザー定義関数(UDF)機能 |
odps-sdk-mapred |
MapReduce 機能 |
odps-sdk-graph |
Graph SDK for Java |
完全な API リファレンスについては、「ODPS SDK Core 0.45.1-public API」をご参照ください。
Maven 依存関係の追加
odps-sdk-core を pom.xml に追加します:
<dependency>
<groupId>com.aliyun.odps</groupId>
<artifactId>odps-sdk-core</artifactId>
<version>X.X.X-public</version>
</dependency>
最新バージョンを確認するには、「search.maven.org」で odps-sdk-core を検索してください。
MaxCompute V2.0 で導入された新規データ型を使用するには、SDK バージョン 0.27.2-public 以降が必要です。
クライアントの初期化
Odps オブジェクトは、すべての SDK 操作のエントリポイントです。これにより、プロジェクト、テーブル、インスタンス、リソース、関数など、すべての MaxCompute リソースにアクセスできます。
MaxCompute は以前 ODPS と呼ばれていました。そのため、現在の SDK バージョンでもエントリクラス名は引き続き ODPS です。
Odps オブジェクトは、コンストラクターに AliyunAccount を渡すことで作成します。AliyunAccount には AccessKey ID と AccessKey Secret を指定します。これらは認証に使用される AccessKey ペアを構成します。
// AccessKey の認証情報を環境変数として保存し、
// コード内に直接記述しないでください。Alibaba Cloud アカウントの AccessKey ペアを使用すると、
// 全 API へのフルアクセス権限が付与されます。日常的な操作には RAM ユーザーを作成・使用してください。
// RAM ユーザーの作成方法については、Resource Access Management (RAM) コンソールをご参照ください。
Account account = new AliyunAccount(
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
);
Odps odps = new Odps(account);
odps.setEndpoint("<your-odps-endpoint>");
odps.setDefaultProject("<your-project>");
以下のプレースホルダーを実際の値に置き換えてください:
| プレースホルダー | 説明 |
|---|---|
<your-odps-endpoint> |
ご利用のリージョン向け MaxCompute エンドポイント(例:http://service.odps.aliyun.com/api |
<your-project> |
ご利用の MaxCompute プロジェクト名 |
クイックリファレンス
Odps オブジェクト上の各コレクションクラスは、一連の SDK 操作に対応しています:
| 操作 | SDK 呼び出し |
|---|---|
| すべてのテーブルを一覧表示 | odps.tables() |
| 特定のテーブルを取得 | odps.tables().get("table_name") |
| すべてのインスタンスを一覧表示 | odps.instances() |
| 特定のインスタンスを取得 | odps.instances().get("instance_id") |
| すべてのリソースを一覧表示 | odps.resources() |
| 特定のリソースを取得 | odps.resources().get("resource_name") |
| すべての関数を一覧表示 | odps.functions() |
| 特定の関数を取得 | odps.functions().get("function_name") |
| SQL ステートメントを実行 | SQLTask.run(odps, sql) |
| プロジェクトの詳細を取得 | odps.projects().get("project_name") |
コアクラス
SQLTask
SQLTask は MaxCompute 上で SQL ステートメントを実行します。SQLTask.run() を呼び出してステートメントを送信すると、ステータスのポーリングや結果の取得に使用できる Instance オブジェクトが返されます。
import java.util.List;
import com.aliyun.odps.Instance;
import com.aliyun.odps.Odps;
import com.aliyun.odps.OdpsException;
import com.aliyun.odps.account.Account;
import com.aliyun.odps.account.AliyunAccount;
import com.aliyun.odps.data.Record;
import com.aliyun.odps.task.SQLTask;
public class RunSqlExample {
private static final String ACCESS_ID = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
private static final String ACCESS_KEY = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
private static final String ENDPOINT = "http://service.odps.aliyun.com/api";
private static final String PROJECT = "<your-project>";
public static void main(String[] args) {
Account account = new AliyunAccount(ACCESS_ID, ACCESS_KEY);
Odps odps = new Odps(account);
odps.setEndpoint(ENDPOINT);
odps.setDefaultProject(PROJECT);
String sql = "select category from iris;";
try {
// SQL ステートメントを送信し、完了を待機
Instance instance = SQLTask.run(odps, sql);
instance.waitForSuccess();
// 結果を取得して出力
List<Record> records = SQLTask.getResult(instance);
for (Record r : records) {
System.out.println(r.get(0).toString());
}
} catch (OdpsException e) {
e.printStackTrace();
}
}
}
使用上の注意点:
-
SQLTask.run()の呼び出しごとに、1 つの SQL ステートメントのみを送信してください。 -
テーブルをプログラムで作成するには、
CREATE TABLEステートメントをSQLTask.run()に渡します。Tableクラスではテーブル作成はサポートされていません。CREATE TABLEの構文については、「テーブル操作」をご参照ください。
Instances および Instance
Instances は、プロジェクト内のすべてのインスタンスのコレクションです。Instance は単一のインスタンスを表し、ステータス、タイムイング、タスクのサマリー情報を公開します。
// すべてのインスタンスを反復処理
for (Instance i : odps.instances()) {
// 各インスタンスを処理
}
// 特定のインスタンスを取得し、そのステータスを確認
Instance instance = odps.instances().get("instance_id");
Date startTime = instance.getStartTime();
Date endTime = instance.getEndTime();
Status instanceStatus = instance.getStatus();
String statusStr;
if (instanceStatus == Status.TERMINATED) {
statusStr = TaskStatus.Status.SUCCESS.toString();
Map<String, TaskStatus> taskStatus = instance.getTaskStatus();
for (Entry<String, TaskStatus> entry : taskStatus.entrySet()) {
if (entry.getValue().getStatus() != TaskStatus.Status.SUCCESS) {
statusStr = entry.getValue().getStatus().toString();
break;
}
}
} else {
statusStr = instanceStatus.toString();
}
// タスクサマリーを取得
TaskSummary summary = instance.getTaskSummary("task_name");
String summaryText = summary.getSummaryText();
Projects および Project
Projects は、認証情報でアクセス可能なすべての MaxCompute プロジェクトのコレクションです。Project は単一のプロジェクトのメタデータを保持します。
// 特定のプロジェクトを取得
Project p = odps.projects().get("project_name");
p.reload();
Tables および Table
Tables は、デフォルトプロジェクト内のすべてのテーブルのコレクションです。Table を使用して、テーブルのスキーマおよびパーティションを確認できます。
// すべてのテーブルを反復処理
for (Table t : odps.tables()) {
// 各テーブルを処理
}
// テーブルを取得し、そのカラムを反復処理
Table table = odps.tables().get("table_name");
for (Column c : table.getSchema().getColumns()) {
String name = c.getName();
TypeInfo type = c.getTypeInfo();
}
// 特定のパーティションにアクセス
Table t = odps.tables().get("table_name");
t.reload();
Partition part = t.getPartition(new PartitionSpec("partition_col=partition_col_value"));
part.reload();
Resources および Resource
Resources は、プロジェクト内のすべてのリソースのコレクションです。リソースには、UDF や MapReduce ジョブで使用されるファイルおよびテーブル参照が含まれます。
// すべてのリソースを反復処理
for (Resource r : odps.resources()) {
// 各リソースを処理
}
// リソースを取得し、そのタイプを確認
Resource r = odps.resources().get("resource_name");
r.reload();
if (r.getType() == Resource.Type.TABLE) {
TableResource tr = new TableResource(r);
String tableSource = tr.getSourceTable().getProject() + "."
+ tr.getSourceTable().getName();
if (tr.getSourceTablePartition() != null) {
tableSource += " partition(" + tr.getSourceTablePartition().toString() + ")";
}
}
ファイルリソースの作成:
String projectName = "my_project";
String source = "my_local_file.txt";
File file = new File(source);
InputStream is = new FileInputStream(file);
FileResource resource = new FileResource();
resource.setName(file.getName());
odps.resources().create(projectName, resource, is);
テーブルリソースの作成:
TableResource resource = new TableResource(tableName, tablePrj, partitionSpec);
resource.setName("table_resource_name");
odps.resources().update(projectName, resource);
Functions および Function
Functions は、プロジェクト内のすべての関数のコレクションです。Function を使用して、MaxCompute に登録された UDF を読み取ったり作成したりできます。
// すべての関数を反復処理
for (Function f : odps.functions()) {
// 各関数を処理
}
// 関数を取得し、関連付けられたリソースを一覧表示
Function f = odps.functions().get("function_name");
List<Resource> resources = f.getResources();
関数の作成:
String classType = "com.aliyun.odps.mapred.open.example.WordCount";
ArrayList<String> resourceList = new ArrayList<>();
for (String r : "resource1:resource2".split(":")) {
resourceList.add(r);
}
Function func = new Function();
func.setName("function_name");
func.setClassType(classType);
func.setResources(resourceList);
odps.functions().create(projectName, func);
MaxCompute Tunnel
Tunnel は Tunnel SDK を基盤としており、MaxCompute テーブルからの大量データのアップロードおよびダウンロードをサポートします。ビューはサポートされていません。
MapReduce
MaxCompute MapReduce でサポートされる SDK クラスおよびメソッドについては、「概要」をご参照ください。
次のステップ
-
MaxComputeでのPythonベースのデータ処理については、概要をご参照ください。
-
完全な Java API リファレンスについては、javadoc.io の「ODPS SDK Core 0.45.1-public API」をご参照ください。