このトピックでは、Object Storage Service (OSS) SDK for Javaを使用して、SelectObjectを呼び出してバケット内のCSVおよびJSONオブジェクトをクエリする方法について説明します。
SelectObject操作の詳細については、「オブジェクトの照会」および「SelectObject」をご参照ください。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSecurity Token Service (STS) を使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。
オブジェクトをクエリするには、
oss:GetObject
権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。SelectObjectを使用して照会できるのは、CSV形式とJSON形式のオブジェクトのみです。
例
次のサンプルコードは、CSVおよびJSONオブジェクトのクエリ方法の例を示しています。
com.aliyun.oss.mo delをインポートします。*;
com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。java.io.BufferedReaderをインポートします。java.io.ByteArrayInputStreamをインポートします。java.io.InputStreamReaderをインポートします。/**
* 選択オブジェクトメタデータと選択オブジェクトの作成例。
*
* /
public class SelectObjectSample {
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。
プライベート静的文字列エンドポイント="https://oss-cn-hangzhou.aliyuncs.com";
// バケットの名前を指定します。 例: examplebucket.
プライベート静的文字列bucketName = "examplebucket";
public static void main(String[] args) throws Exception {
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
// クエリするオブジェクトの完全パスを指定し、SELECTステートメントを使用してオブジェクトのデータをクエリします。 バケット名をフルパスに含めないでください。
// CSVオブジェクトのフルパスを指定します。
selectCsvSample("test.csv" 、ossClient);
// JSONオブジェクトのフルパスを指定します。
selectJsonSample("test.json" 、ossClient);
ossClient.shutdown();
}
private static void selectCsvSample (文字列キー、OSS ossClient) が例外をスロー {
// アップロードするオブジェクトのコンテンツを指定します。
String content = "name,school,company,age\r\n" +
"Lora Francis,School A,Staples Inc,27\r\n" +
"エレノア・リトル、スクールB、\" Conectiv、Inc\"、43\r\n" +
「ロージー・ヒューズ、スクールC、Western Gas Resources Inc、44\r\n」 +
「ローレンス・ロス、スクールD、メットライフ社、24」;
ossClient.putObject(bucketName, key, new ByteArrayInputStream(content.getBytes()));
SelectObjectMetadata selectObjectMetadata = ossClient.createSelectObjectMetadata ()
new CreateSelectObjectMetadataRequest(bucketName, key)
.withInputSerialization(
new InputSerialization().withCsvInputFormat(
// コンテンツ内のさまざまなレコードを区切るために使用される区切り文字を指定します。 例: \r\n。
新しいCSVFormat().withHeaderInfo(CSVFormat.Header.Use).withRecordDelimiter("\r\n")));
System.out.println(selectObjectMetadata.getCsvObjectMetadata().getTotalLines());
System.out.println(selectObjectMetadata.getCsvObjectMetadata().getSplits());
SelectObjectRequest selectObjectRequest =
新しいSelectObjectRequest(bucketName, key)
.withInputSerialization(
new InputSerialization().withCsvInputFormat(
新しいCSVFormat().withHeaderInfo(CSVFormat.Header.Use).withRecordDelimiter("\r\n")))
. withOutputSerialization(new OutputSerialization().withCsvOutputFormat(new CSVFormat()));
// SELECTステートメントを使用して、4番目の列の値が40より大きいすべてのレコードを照会します。
selectObjectRequest.setExpression("select * from ossobject where _4 > 40");
OSSObject ossObject = ossClient.selectObject(selectObjectRequest);
// オブジェクトの内容を読み取ります。
BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
一方、(TRUE){
String line = reader.readLine();
if (line == null) {
break;
}
System.out.println (ライン);
}
reader.close();
ossClient.de leteObject(bucketName、key);
}
private static void selectJsonSample (文字列キー、OSS ossClient) が例外をスロー {
// アップロードするオブジェクトのコンテンツを指定します。
final String content = "{\n" +
"\t\" name\": \" Lora Francis\",\n" +
"\t\" age\": 27,\n" +
"\t\" company\": \" ステープルズ株式会社 \"\n" +
"}\n" +
"{\n" +
"\t\" name\": \" Eleanor Little\",\n" +
"\t\" age\": 43,\n" +
"\t\" company\": \" Conectiv、Inc\"\n" +
"}\n" +
"{\n" +
"\t\" name\": \" Rosie Hughes\",\n" +
"\t\" age\": 44,\n" +
"\t\" company\": \" Western Gas Resources Inc\"\n" +
"}\n" +
"{\n" +
"\t\" name\": \" ローレンス・ロス \",\n" +
"\t\" age\": 24,\n" +
"\t\" 会社 \": \" メットライフ株式会社 \"\n" +
"}";
ossClient.putObject(bucketName, key, new ByteArrayInputStream(content.getBytes()));
SelectObjectRequest selectObjectRequest =
新しいSelectObjectRequest(bucketName, key)
. withInputSerialization(new InputSerialization())
. withCompressionType(CompressionType.NONE)
. withJsonInputFormat(new JsonFormat().withJsonType(JsonType.LINES)))
. withOutputSerialization(new OutputSerialization())
. withCrcEnabled(true)
. withJsonOutputFormat (新しいJsonFormat())
. withExpression("select * from ossobject as s where s.age > 40"); // SELECTステートメントを使用して、オブジェクト内のデータを照会します。
OSSObject ossObject = ossClient.selectObject(selectObjectRequest);
// オブジェクトの内容を読み取ります。
BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
一方、(TRUE){
String line = reader.readLine();
if (line == null) {
break;
}
System.out.println (ライン);
}
reader.close();
ossClient.de leteObject(bucketName、key);
}
}
参考資料
オブジェクトのクエリに使用する完全なサンプルコードについては、『GitHub』をご参照ください。
オブジェクトをクエリするために呼び出すAPI操作の詳細については、「SelectObject」をご参照ください。