Java SDK は、MaxCompute によって提供される Java プログラミング言語インターフェイスのセットです。これらのインターフェイスを使用すると、Java コードを使用して、プロジェクトへのアクセスと管理、データテーブルの操作、データ転送、関数管理など、MaxCompute サービスを操作および管理できます。このトピックでは、Java 用 MaxCompute SDK が提供するパッケージと、インスタンス、リソース、テーブル、関数などの SDK のコアクラスについて説明します。
Java 用 MaxCompute SDK を使用して MaxCompute が提供するコンピューティングおよびストレージサービスにアクセスする場合、他の方法でサービスにアクセスする場合と同じ方法で課金されます。 詳細については、「」をご参照ください。
背景情報
このトピックでは、Java 用 MaxCompute SDK のコアクラスについて説明します。 SDK の詳細については、ODPS SDK Core 0.45.1-public API をご参照ください。
Maven を使用して、使用する SDK のバージョンを構成できます。 たとえば、使用する odps-sdk-core のバージョンを指定するには、次の Maven 依存関係を追加します。
<dependency>
<groupId>com.aliyun.odps</groupId>
<artifactId>odps-sdk-core</artifactId>
<version>X.X.X-public</version>
</dependency>MaxCompute V2.0 データ型エディションで導入された 新しいデータ型 は、0.27.2-public 以降のバージョンの SDK でのみサポートされています。
search.maven.org で odps-sdk-core を検索すると、SDK の最新バージョンを入手できます。
次の表に、Java 用 MaxCompute SDK が提供するパッケージを示します。
パッケージ名 | 説明 |
odps-sdk-core | テーブルとプロジェクトの管理を可能にする機能など、MaxCompute の基本機能を提供します。 このパッケージを使用して、Tunnel サービスにアクセスすることもできます。 |
odps-sdk-commons | 共通ユーティリティを提供します。 |
odps-sdk-udf | ユーザー定義関数 (UDF) 機能を提供します。 |
odps-sdk-mapred | MapReduce 機能を提供します。 |
odps-sdk-graph | Java 用 Graph SDK を提供します。 odps-sdk-graph を検索することで SDK を入手できます。 |
AliyunAccount
この API を呼び出して、Alibaba Cloud アカウントを取得できます。 AliyunAccount クラスのコンストラクターは、入力パラメーターとして AccessKey ID と AccessKey シークレットを使用します。 AccessKey ID と AccessKey シークレットは、Alibaba Cloud ユーザーを認証するために使用される AccessKey ペアを構成します。 この API は、MaxCompute を初期化するために使用されるクラスとも見なされます。
ODPS
Odps クラスは、Java 用 MaxCompute SDK のエントリポイントです。 Odps クラスを使用すると、プロジェクト、テーブル、リソース、関数、インスタンス など、MaxCompute 内のすべてのタイプのオブジェクトにアクセスできます。
AliyunAccount オブジェクトを Odps クラスのコンストラクターに渡して、Odps オブジェクトを作成できます。 次のコードは例を示しています。
// Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 AccessKey ペアを使用して API 操作を呼び出すと、リスクが発生する可能性があります。 API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを作成して使用することをお勧めします。 RAM ユーザーを作成するには、Resource Access Management (RAM) コンソールにログインします。
// この例では、AccessKey ID と AccessKey シークレットは環境変数として構成されています。 ビジネス要件に基づいて、構成ファイルに AccessKey ペアを保存することもできます。
// AccessKey ペアの漏洩を防ぐため、コード内で AccessKey ID と AccessKey シークレットを直接指定しないことをお勧めします。
Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Odps odps = new Odps(account);
String odpsUrl = "<your odps endpoint>";
odps.setEndpoint(odpsUrl);
odps.setDefaultProject("my_project");
for (Table t : odps.tables()) {
....
} MaxCompute Tunnel
MaxCompute Tunnel は、Tunnel SDK 上に構築されています。 これにより、Tunnel を介して MaxCompute テーブル (ビューを除く) にデータをアップロードしたり、MaxCompute テーブルからデータをダウンロードしたりできます。
MapReduce
MapReduce でサポートされている SDK の詳細については、「概要」をご参照ください。
Projects
Projects クラスは、MaxCompute 内のすべてのプロジェクトのコレクションを定義します。 各 MaxCompute プロジェクトは、コレクション内の要素です。 次のコードは例を示しています。
// Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 AccessKey ペアを使用して API 操作を呼び出すと、リスクが発生する可能性があります。 API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを作成して使用することをお勧めします。 RAM ユーザーを作成するには、RAM コンソールにログインします。
// この例では、AccessKey ID と AccessKey シークレットは環境変数として構成されています。 ビジネス要件に基づいて、構成ファイルに AccessKey ペアを保存することもできます。
// AccessKey ペアの漏洩を防ぐため、コード内で AccessKey ID と AccessKey シークレットを直接指定しないことをお勧めします。
Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Odps odps = new Odps(account);
String odpsUrl = "<your odps endpoint>";
odps.setEndpoint(odpsUrl);
Project p = odps.projects().get("my_exists");
p.reload();
...Project
Project クラスは、プロジェクトの詳細を定義します。 Projects クラスの get メソッドを呼び出すことで、指定されたプロジェクトを取得できます。
SQLTask
SQLTask クラスを使用すると、MaxCompute で SQL 文を実行および処理できます。 SQLTask クラスの run メソッドを呼び出すことで、SQL 文を実行できます。
run メソッドは、Instance オブジェクトを返します。 Instance オブジェクトから、SQL 文のステータスと実行結果を取得できます。 次のコードは例を示しています。
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 TestSql {
// Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 AccessKey ペアを使用して API 操作を呼び出すと、リスクが発生する可能性があります。 API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを作成して使用することをお勧めします。 RAM ユーザーを作成するには、RAM コンソールにログインします。
// この例では、AccessKey ID と AccessKey シークレットは環境変数として構成されています。 ビジネス要件に基づいて、構成ファイルに AccessKey ペアを保存することもできます。
// AccessKey ペアの漏洩を防ぐため、コード内で AccessKey ID と AccessKey シークレットを直接指定しないことをお勧めします。
private static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
private static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
private static final String endPoint = "http://service.odps.aliyun.com/api";
private static final String project = "";
private static final String sql = "select category from iris;";
public static void
main(String[] args) {
Account account = new AliyunAccount(accessId, accessKey);
Odps odps = new Odps(account);
odps.setEndpoint(endPoint);
odps.setDefaultProject(project);
Instance i;
try {
i = SQLTask.run(odps, sql);
i.waitForSuccess();
List<Record> records = SQLTask.getResult(i);
for(Record r:records){
System.out.println(r.get(0).toString());
}
} catch (OdpsException e) {
e.printStackTrace();
}
}
}一度に送信して実行できる SQL 文は 1 つだけです。
Java 用 MaxCompute SDK を使用してテーブルを作成するには、Table クラスではなく SQLTask クラスを使用する必要があります。 SQLTask オブジェクトを使用して CREATE TABLE 文を実行する前に、CREATE TABLE 文を SQLTask に渡す必要があります。 CREATE TABLE 文の詳細については、「テーブル操作」をご参照ください。
Instances
Instances クラスは、MaxCompute 内のすべてのインスタンスのコレクションを定義します。 各インスタンスは、コレクション内の要素です。 次のコードは例を示しています。
// Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 AccessKey ペアを使用して API 操作を呼び出すと、リスクが発生する可能性があります。 API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを作成して使用することをお勧めします。 RAM ユーザーを作成するには、RAM コンソールにログインします。
// この例では、AccessKey ID と AccessKey シークレットは環境変数として構成されています。 ビジネス要件に基づいて、構成ファイルに AccessKey ペアを保存することもできます。
// AccessKey ペアの漏洩を防ぐため、コード内で AccessKey ID と AccessKey シークレットを直接指定しないことをお勧めします。
Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Odps odps = new Odps(account);
String odpsUrl = "<your odps endpoint>";
odps.setEndpoint(odpsUrl);
odps.setDefaultProject("my_project");
for (Instance i : odps.instances()) {
....
}Instance
Instance クラスは、インスタンスの詳細を定義します。 Instances クラスの get メソッドを呼び出すことで、指定されたインスタンスを取得できます。 次のコードは例を示しています。
// Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 AccessKey ペアを使用して API 操作を呼び出すと、リスクが発生する可能性があります。 API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを作成して使用することをお勧めします。 RAM ユーザーを作成するには、RAM コンソールにログインします。
// この例では、AccessKey ID と AccessKey シークレットは環境変数として構成されています。 ビジネス要件に基づいて、構成ファイルに AccessKey ペアを保存することもできます。
// AccessKey ペアの漏洩を防ぐため、コード内で AccessKey ID と AccessKey シークレットを直接指定しないことをお勧めします。
Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Odps odps = new Odps(account);
String odpsUrl = "<your odps endpoint>";
odps.setEndpoint(odpsUrl);
Instance instance= odps.instances().get("instance id");
Date startTime = instance.getStartTime();
Date endTime = instance.getEndTime();
...
Status instanceStatus = instance.getStatus();
String instanceStatusStr = null;
if (instanceStatus == Status.TERMINATED) {
instanceStatusStr = TaskStatus.Status.SUCCESS.toString();
Map<String, TaskStatus> taskStatus = instance.getTaskStatus();
for (Entry<String, TaskStatus> status : taskStatus.entrySet()) {
if (status.getValue().getStatus() != TaskStatus.Status.SUCCESS) {
instanceStatusStr = status.getValue().getStatus().toString();
break;
}
}
} else {
instanceStatusStr = instanceStatus.toString();
}
...
TaskSummary summary = instance.getTaskSummary("task name");
String s = summary.getSummaryText();Tables
Tables クラスは、MaxCompute 内のすべてのテーブルのコレクションを定義します。 各テーブルは、コレクション内の要素です。 次のコードは例を示しています。
// Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 AccessKey ペアを使用して API 操作を呼び出すと、リスクが発生する可能性があります。 API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを作成して使用することをお勧めします。 RAM ユーザーを作成するには、RAM コンソールにログインします。
// この例では、AccessKey ID と AccessKey シークレットは環境変数として構成されています。 ビジネス要件に基づいて、構成ファイルに AccessKey ペアを保存することもできます。
// AccessKey ペアの漏洩を防ぐため、コード内で AccessKey ID と AccessKey シークレットを直接指定しないことをお勧めします。
Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Odps odps = new Odps(account);
String odpsUrl = "<your odps endpoint>";
odps.setEndpoint(odpsUrl);
odps.setDefaultProject("my_project");
for (Table t : odps.tables()) {
....
}Table
Table クラスは、テーブルの詳細を定義します。 Tables クラスの get メソッドを呼び出すことで、指定されたテーブルを取得できます。 次のコードは例を示しています。
// Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 AccessKey ペアを使用して API 操作を呼び出すと、リスクが発生する可能性があります。 API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを作成して使用することをお勧めします。 RAM ユーザーを作成するには、RAM コンソールにログインします。
// この例では、AccessKey ID と AccessKey シークレットは環境変数として構成されています。 ビジネス要件に基づいて、構成ファイルに AccessKey ペアを保存することもできます。
// AccessKey ペアの漏洩を防ぐため、コード内で AccessKey ID と AccessKey シークレットを直接指定しないことをお勧めします。
Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Odps odps = new Odps(account);
String odpsUrl = "<your odps endpoint>";
odps.setEndpoint(odpsUrl);
odps.setDefaultProject("my_project");
Table table = odps.tables().get("tablename");
for(Column c : table.getSchema().getColumns())
{
String name = c.getName();
TypeInfo type = c.getTypeInfo();
}次のコードは、テーブルのパーティション内のデータを取得する方法を示しています。
// Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 AccessKey ペアを使用して API 操作を呼び出すと、リスクが発生する可能性があります。 API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを作成して使用することをお勧めします。 RAM ユーザーを作成するには、RAM コンソールにログインします。
// この例では、AccessKey ID と AccessKey シークレットは環境変数として構成されています。 ビジネス要件に基づいて、構成ファイルに AccessKey ペアを保存することもできます。
// AccessKey ペアの漏洩を防ぐため、コード内で AccessKey ID と AccessKey シークレットを直接指定しないことをお勧めします。
Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Odps odps = new Odps(account);
String odpsUrl = "<your odps endpoint>";
odps.setEndpoint(odpsUrl);
Table t = odps.tables().get("table name");
t.reload();
Partition part = t.getPartition(new PartitionSpec("partition_col=partition_col_value"));
part.reload();
...Resources
Resources クラスは、MaxCompute 内のすべてのリソースのコレクションを定義します。 各リソースは、コレクション内の要素です。 次のコードは例を示しています。
// Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 AccessKey ペアを使用して API 操作を呼び出すと、リスクが発生する可能性があります。 API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを作成して使用することをお勧めします。 RAM ユーザーを作成するには、RAM コンソールにログインします。
// この例では、AccessKey ID と AccessKey シークレットは環境変数として構成されています。 ビジネス要件に基づいて、構成ファイルに AccessKey ペアを保存することもできます。
// AccessKey ペアの漏洩を防ぐため、コード内で AccessKey ID と AccessKey シークレットを直接指定しないことをお勧めします。
Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Odps odps = new Odps(account);
String odpsUrl = "<your odps endpoint>";
odps.setEndpoint(odpsUrl);
odps.setDefaultProject("my_project");
for (Resource r : odps.resources()) {
....
}Resource
Resource クラスは、各リソースの詳細を定義します。 Resources クラスの get メソッドを呼び出すことで、指定されたリソースを取得できます。 次のコードは例を示しています。
// Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 AccessKey ペアを使用して API 操作を呼び出すと、リスクが発生する可能性があります。 API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを作成して使用することをお勧めします。 RAM ユーザーを作成するには、RAM コンソールにログインします。
// この例では、AccessKey ID と AccessKey シークレットは環境変数として構成されています。 ビジネス要件に基づいて、構成ファイルに AccessKey ペアを保存することもできます。
// AccessKey ペアの漏洩を防ぐため、コード内で AccessKey ID と AccessKey シークレットを直接指定しないことをお勧めします。
Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Odps odps = new Odps(account);
String odpsUrl = "<your odps endpoint>";
odps.setEndpoint(odpsUrl);
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_porject";
String source = "my_local_file.txt";
File file = new File(source);
InputStream is = new FileInputStream(file);
FileResource resource = new FileResource();
String name = file.getName();
resource.setName(name);
odps.resources().create(projectName, resource, is);次のコードは、テーブルリソースを作成する方法を示しています。
TableResource resource = new TableResource(tableName, tablePrj, partitionSpec);
//resource.setName(INVALID_USER_TABLE);
resource.setName("table_resource_name");
odps.resources().update(projectName, resource);Functions
Functions クラスは、MaxCompute 内のすべての関数のコレクションを定義します。 各関数は、コレクション内の要素です。 次のコードは例を示しています。
// Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 AccessKey ペアを使用して API 操作を呼び出すと、リスクが発生する可能性があります。 API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを作成して使用することをお勧めします。 RAM ユーザーを作成するには、RAM コンソールにログインします。
// この例では、AccessKey ID と AccessKey シークレットは環境変数として構成されています。 ビジネス要件に基づいて、構成ファイルに AccessKey ペアを保存することもできます。
// AccessKey ペアの漏洩を防ぐため、コード内で AccessKey ID と AccessKey シークレットを直接指定しないことをお勧めします。
Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Odps odps = new Odps(account);
String odpsUrl = "<your odps endpoint>";
odps.setEndpoint(odpsUrl);
odps.setDefaultProject("my_project");
for (Function f : odps.functions()) {
....
} Function
Function クラスは、関数の詳細を定義します。 Functions クラスの get メソッドを呼び出すことで、指定された関数を取得できます。 次のコードは例を示しています。
// Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 AccessKey ペアを使用して API 操作を呼び出すと、リスクが発生する可能性があります。 API 操作の呼び出しや日常的な O&M の実行には、RAM ユーザーを作成して使用することをお勧めします。 RAM ユーザーを作成するには、RAM コンソールにログインします。
// この例では、AccessKey ID と AccessKey シークレットは環境変数として構成されています。 ビジネス要件に基づいて、構成ファイルに AccessKey ペアを保存することもできます。
// AccessKey ペアの漏洩を防ぐため、コード内で AccessKey ID と AccessKey シークレットを直接指定しないことをお勧めします。
Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
Odps odps = new Odps(account);
String odpsUrl = "<your odps endpoint>";
odps.setEndpoint(odpsUrl);
Function f = odps.functions().get("function name");
List<Resource> resources = f.getResources(); 次のコードは、関数を作成する方法を示しています。
String resources = "xxx:xxx";
String classType = "com.aliyun.odps.mapred.open.example.WordCount";
ArrayList<String> resourceList = new ArrayList<String>();
for (String r : resources.split(":")) {
resourceList.add(r);
}
Function func = new Function();
func.setName(name);
func.setClassType(classType);
func.setResources(resourceList);
odps.functions().create(projectName, func); 参照
Python を使用して MaxCompute 内のデータを操作および処理する場合は、「概要」をご参照ください。