All Products
Search
Document Center

MaxCompute:Contoh-contoh SDK Java

Last Updated:Jul 06, 2025

MaxCompute mendukung mesin pihak ketiga seperti Spark on EMR, StarRocks, Presto, PAI, dan Hologres, memungkinkan akses langsung ke data MaxCompute melalui Storage API menggunakan Java SDK. Topik ini menyediakan contoh kode untuk mengakses MaxCompute dengan Java SDK.

Ikhtisar

Antarmuka utama untuk akses Java SDK ke MaxCompute tercantum di bawah ini.

Antarmuka utama

Deskripsi

TableReadSessionBuilder

Digunakan untuk membuat sesi pembacaan tabel MaxCompute.

TableBatchReadSession

Mewakili sesi untuk membaca data dari tabel MaxCompute.

SplitReader

Digunakan untuk membaca segmen data yang terkandung dalam sesi data.

Untuk pengguna Maven, cari odps-sdk-table-api di repositori Maven untuk mendapatkan versi berbeda dari Java SDK. Detail konfigurasi adalah sebagai berikut.

<dependency>
	<groupId>com.aliyun.odps</groupId>
	<artifactId>odps-sdk-table-api</artifactId>
	<version>0.48.8-public</version>
</dependency>

MaxCompute menawarkan API penyimpanan. Untuk informasi lebih lanjut, lihat odps-sdk-table-api.

TableReadSessionBuilder

Antarmuka ini dirancang untuk membuat sesi pembacaan untuk tabel MaxCompute. Definisi antarmuka utama adalah sebagai berikut. Untuk detail lebih lanjut, lihat Java-sdk-doc.

Definisi Antarmuka

public class TableReadSessionBuilder {

    public TableReadSessionBuilder table(Table table);

    public TableReadSessionBuilder identifier(TableIdentifier identifier);

    public TableReadSessionBuilder requiredDataColumns(List<String> requiredDataColumns);

    public TableReadSessionBuilder requiredPartitionColumns(List<String> requiredPartitionColumns);

    public TableReadSessionBuilder requiredPartitions(List<PartitionSpec> requiredPartitions);

    public TableReadSessionBuilder requiredBucketIds(List<Integer> requiredBucketIds);

    public TableReadSessionBuilder withSplitOptions(SplitOptions splitOptions);

    public TableReadSessionBuilder withArrowOptions(ArrowOptions arrowOptions);

    public TableReadSessionBuilder withFilterPredicate(Predicate filterPredicate);

    public TableReadSessionBuilder withSettings(EnvironmentSettings settings);

    public TableReadSessionBuilder withSessionId(String sessionId);

    public TableBatchReadSession buildBatchReadSession();
}

Catatan Penggunaan

Nama Metode

Deskripsi

table(Table table)

Mendefinisikan parameter Table yang dilewatkan sebagai tabel target dalam sesi saat ini.

identifier(TableIdentifier identifier)

Mendefinisikan parameter TableIdentifier yang dilewatkan sebagai tabel target dalam sesi saat ini.

requiredDataColumns(List<String> requiredDataColumns)

Membaca data dari bidang yang ditentukan dan memastikan bahwa urutan bidang dalam data yang dikembalikan konsisten dengan urutan yang ditentukan oleh parameter requiredDataColumns. Ini berlaku untuk skenario pemotongan bidang data.

Catatan

Jika parameter requiredDataColumns kosong, semua data partisi akan dikembalikan.

requiredPartitionColumns(List<String> requiredPartitionColumns)

Membaca data dari kolom tertentu dalam partisi tertentu dari tabel yang diberikan. Ini berlaku dalam skenario di mana pemangkasan partisi dilakukan.

Catatan

Jika parameter requiredPartitionColumns kosong, semua data partisi akan dikembalikan.

requiredPartitions(List<PartitionSpec> requiredPartitions)

Membaca data dari partisi tertentu dari tabel tertentu. Ini berlaku untuk skenario pemotongan partisi.

Catatan

Jika parameter requiredPartitions kosong, semua data partisi akan dikembalikan.

requiredBucketIds(List<Integer> requiredBucketIds)

Membaca data dari Bucket tertentu. Ini hanya efektif untuk tabel terkluster dan berlaku untuk skenario pemotongan Bucket.

Catatan

Jika parameter requiredBucketIds kosong, semua data Bucket akan dikembalikan.

withSplitOptions(SplitOptions splitOptions)

Membagi data tabel. Objek SplitOptions didefinisikan sebagai berikut:

public class SplitOptions {

    public static SplitOptions.Builder newBuilder() {
        return new Builder();
    }

    public static class Builder {

      public SplitOptions.Builder SplitByByteSize(long splitByteSize);
  
      public SplitOptions.Builder SplitByRowOffset();
  
      public SplitOptions.Builder withCrossPartition(boolean crossPartition);
  
      public SplitOptions.Builder withMaxFileNum(int splitMaxFileNum);
  
      public SplitOptions build();
    }
}
  • SplitByByteSize(long splitByteSize): Membagi data sesuai dengan parameter splitByteSize yang ditentukan. Ukuran segmen data tunggal yang dikembalikan oleh server tidak melebihi splitByteSize (unit: byte).

    Catatan
    • Jika Anda tidak menggunakan SplitByByteSize(long splitByteSize) untuk menyesuaikan nilai pemisahan data, sistem akan secara default membagi data sesuai dengan 256×1024×1024 (256 MB).

    • Nilai pemisahan data yang disesuaikan tidak boleh kurang dari 10×1024×1024 (10 MB).

  • SplitByRowOffset(): Membagi data berdasarkan baris, memungkinkan klien membaca data dari indeks baris tertentu.

  • withCrossPartition(boolean crossPartition): Menentukan apakah satu segmen data diizinkan berisi beberapa partisi data. Parameter crossPartition memiliki nilai berikut:

    • true (default): Mengizinkan satu segmen data berisi beberapa partisi data.

    • false: Tidak mengizinkannya.

  • withMaxFileNum(int splitMaxFileNum): Ketika jumlah file tabel besar, Anda dapat menentukan jumlah maksimum file fisik yang terkandung dalam satu segmen data untuk menghasilkan lebih banyak segmen data.

    Catatan

    Secara default, tidak ada batasan pada jumlah file fisik yang terkandung dalam satu segmen data.

  • build(): Membuat objek SplitOptions.

Contoh penggunaan

// 1. Membagi data berdasarkan SplitSize, atur SplitSize menjadi 256MB

SplitOptions splitOptionsByteSize = 
      SplitOptions.newBuilder().SplitByByteSize(256 * 1024L * 1024L).build()

// 2. Membagi data berdasarkan RowOffset

SplitOptions splitOptionsCount = 
      SplitOptions.newBuilder().SplitByRowOffset().build()

//3. Tentukan jumlah maksimum file yang terkandung dalam satu Split menjadi 1

SplitOptions splitOptionsCount = 
      SplitOptions.newBuilder().SplitByRowOffset().withMaxFileNum(1).build()

withArrowOptions(ArrowOptions arrowOptions)

Menentukan opsi data Arrow. Objek ArrowOptions didefinisikan sebagai berikut:

public class ArrowOptions {
    
    public static Builder newBuilder() {
        return new Builder();
    }

    public static class Builder {

        public Builder withTimestampUnit(TimestampUnit unit);

        public Builder withDatetimeUnit(TimestampUnit unit);

        public ArrowOptions build();
    }

    public enum TimestampUnit {
        SECOND,
        MILLI,
        MICRO,
        NANO;
    }
}
  • TimestampUnit: Menentukan unit data tipe Timestamp dan Datetime. Nilainya adalah sebagai berikut:

    • SECOND: detik (s).

    • MILLI: milidetik (ms).

    • MICRO: mikrodetik (μs).

    • NANO: nanodetik (ns).

  • withTimestampUnit(TimestampUnit unit): Menentukan unit tipe data Timestamp. Unit defaultnya adalah NANO.

  • withDatetimeUnit(TimestampUnit unit): Menentukan unit tipe data Datetime. Unit defaultnya adalah MILLI.

Contoh penggunaan

ArrowOptions options = ArrowOptions.newBuilder()
          .withDatetimeUnit(ArrowOptions.TimestampUnit.MILLI)
          .withTimestampUnit(ArrowOptions.TimestampUnit.NANO)
          .build()

withFilterPredicate(Predicate filterPredicate)

Menentukan opsi Predicate Pushdown. Predicate didefinisikan sebagai berikut:

// 1. Operasi biner

public class BinaryPredicate extends Predicate {

  public enum Operator {
    /**
     * Operator operasi biner
     */
    EQUALS("="),
    NOT_EQUALS("!="),
    GREATER_THAN(">"),
    LESS_THAN("<"),
    GREATER_THAN_OR_EQUAL(">="),
    LESS_THAN_OR_EQUAL("<=");
   
  }

  public BinaryPredicate(Operator operator, Serializable leftOperand, Serializable rightOperand);

  public static BinaryPredicate equals(Serializable leftOperand, Serializable rightOperand);

  public static BinaryPredicate notEquals(Serializable leftOperand, Serializable rightOperand);

  public static BinaryPredicate greaterThan(Serializable leftOperand, Serializable rightOperand);

  public static BinaryPredicate lessThan(Serializable leftOperand, Serializable rightOperand);

  public static BinaryPredicate greaterThanOrEqual(Serializable leftOperand,
                                                   Serializable rightOperand);

  public static BinaryPredicate lessThanOrEqual(Serializable leftOperand,
                                                Serializable rightOperand);
}

// 2. Operasi uner
public class UnaryPredicate extends Predicate {

  public enum Operator {
    /**
     * Operator operasi uner
     */
    IS_NULL("is null"),
    NOT_NULL("is not null");
  }

  public static UnaryPredicate isNull(Serializable operand);
  public static UnaryPredicate notNull(Serializable operand);
}

### 3. IN dan NOT IN
public class InPredicate extends Predicate {

  public enum Operator {
    /**
     * Operator IN dan NOT IN untuk pengecekan keanggotaan set
     */
    IN("in"),
    NOT_IN("not in");
  }

  public InPredicate(Operator operator, Serializable operand, List<Serializable> set);

  public static InPredicate in(Serializable operand, List<Serializable> set);

  public static InPredicate notIn(Serializable operand, List<Serializable> set);
}

// 4. Nama kolom
public class Attribute extends Predicate {

  public Attribute(Object value);
    
  public static Attribute of(Object value);
}

// 5. Konstanta
public class Constant extends Predicate {

  public Constant(Object value);

  public static Constant of(Object value);
}

// 6. Operasi majemuk
public class CompoundPredicate extends Predicate {

  public enum Operator {
    /**
     * Operator predikat majemuk
     */
    AND("and"),
    OR("or"),
    NOT("not");
  }

  public CompoundPredicate(Operator logicalOperator, List<Predicate> predicates);

  public static CompoundPredicate and(Predicate... predicates);
  
  public static CompoundPredicate or(Predicate... predicates);

  public static CompoundPredicate not(Predicate predicates);

  public void addPredicate(Predicate predicate);
}

Contoh penggunaan

// 1. c1 > 20000 and c2 < 100000
BinaryPredicate c1 = new BinaryPredicate(BinaryPredicate.Operator.GREATER_THAN, Attribute.of("c1"), Constant.of(20000));
BinaryPredicate c2 = new BinaryPredicate(BinaryPredicate.Operator.LESS_THAN, Attribute.of("c2"), Constant.of(100000));
CompoundPredicate predicate =
        new CompoundPredicate(CompoundPredicate.Operator.AND, ImmutableList.of(c1, c2));

// 2. c1 is not null
Predicate predicate = new UnaryPredicate(UnaryPredicate.Operator.NOT_NULL,  Attribute.of("c1"));

  
// 3. c1 in (1, 10001)
Predicate predicate =
        new InPredicate(InPredicate.Operator.IN,  Attribute.of("c1"), ImmutableList.of(Constant.of(1), Constant.of(10001)));

withSettings(EnvironmentSettings settings)

Menentukan informasi lingkungan runtime. Antarmuka EnvironmentSettings didefinisikan sebagai berikut:

public class EnvironmentSettings {

    public static Builder newBuilder() {
        return new Builder();
    }

    public static class Builder {

        public Builder withDefaultProject(String projectName);

        public Builder withDefaultSchema(String schema);

        public Builder withServiceEndpoint(String endPoint);

        public Builder withTunnelEndpoint(String tunnelEndPoint);

        public Builder withQuotaName(String quotaName);

        public Builder withCredentials(Credentials credentials);

        public Builder withRestOptions(RestOptions restOptions);

        public EnvironmentSettings build();
    }
}
  • withDefaultProject(String projectName): Mengatur nama proyek saat ini.

    Catatan

    Parameter projectName adalah nama proyek MaxCompute. Anda dapat masuk ke konsol MaxCompute, beralih wilayah di pojok kiri atas, dan pilih Workspace > Projects di panel navigasi sebelah kiri untuk melihat nama proyek MaxCompute spesifik.

  • withDefaultSchema(String schema): Mengatur skema default saat ini.

    Catatan

    Parameter schema adalah nama Skema MaxCompute. Untuk informasi lebih lanjut tentang Skema, lihat Operasi terkait Skema.

  • withServiceEndpoint(String endPoint): Mengatur alamat koneksi layanan Endpoint saat ini.

    Catatan

    Untuk informasi Endpoint di setiap wilayah, lihat Endpoints.

  • withTunnelEndpoint(String tunnelEndPoint): Mengatur alamat koneksi layanan TunnelEndpoint saat ini.

    Catatan

    Untuk informasi TunnelEndpoint di setiap wilayah, lihat Endpoints.

  • withQuotaName(String quotaName): Menentukan nama Quota yang sedang digunakan.

    MaxCompute mendukung untuk mengakses grup sumber daya Data Transmission Service eksklusif (langganan) sumber daya. Metode untuk mendapatkan nama Quota adalah sebagai berikut:

  • withCredentials(Credentials credentials): Menentukan informasi autentikasi saat ini. Credentials didefinisikan sebagai berikut:

    public class Credentials {
    
        public static Builder newBuilder() {
            return new Builder();
        }
    
        public static class Builder {
    
            public Builder withAccount(Account account);
    
            public Builder withAppAccount(AppAccount appAccount);
    
            public Builder withAppStsAccount(AppStsAccount appStsAccount);
    
            public Credentials build();
        }
    
    }
    • withAccount(Account account): Menentukan objek Odps Account.

    • withAppAccount(AppAccount appAccount): Menentukan objek Odps appAccount.

    • withAppStsAccount(AppStsAccount appStsAccount): Menentukan objek Odps appStsAccount.

    • withRestOptions(RestOptions restOptions): Menentukan konfigurasi akses jaringan saat ini. RestOptions didefinisikan sebagai berikut:

      public class RestOptions implements Serializable {
      
          public static Builder newBuilder() {
              return new RestOptions.Builder();
          }
      
          public static class Builder {
              public Builder witUserAgent(String userAgent);
              public Builder withConnectTimeout(int connectTimeout);
              public Builder withReadTimeout(int readTimeout);
              public RestOptions build();
          }
      }
      • witUserAgent(String userAgent): Menentukan informasi userAgent saat ini.

      • withConnectTimeout(int connectTimeout): Menentukan waktu habis koneksi jaringan dasar saat ini. Defaultnya adalah 10 detik.

      • withReadTimeout(int readTimeout): Menentukan waktu habis koneksi jaringan dasar saat ini, 120 detik.

withSessionId(String sessionId)

Menentukan informasi SessionID untuk memuat ulang sesi yang ada.

buildBatchReadSession()

Membuat atau mendapatkan sesi pembacaan tabel. Jika parameter input SessionID diberikan, Session yang dibuat akan dikembalikan berdasarkan SessionID. Jika tidak ada parameter input yang diberikan, sesi pembacaan tabel baru akan dibuat.

Catatan

Operasi pembuatan memiliki overhead yang besar. Ketika ada banyak file, akan memakan waktu lama untuk menyelesaikannya.

TableBatchReadSession

Antarmuka TableBatchReadSession mewakili sesi untuk membaca dari tabel MaxCompute. Definisi antarmuka utama adalah sebagai berikut.

Definisi Antarmuka

public interface TableBatchReadSession {

    String getId();

    TableIdentifier getTableIdentifier();

    SessionStatus getStatus();

    DataSchema readSchema();
    
    InputSplitAssigner getInputSplitAssigner() throws IOException;

    SplitReader<ArrayRecord> createRecordReader(InputSplit split, ReaderOptions options) throws IOException;

    SplitReader<VectorSchemaRoot> createArrowReader(InputSplit split, ReaderOptions options) throws IOException;    

}

Catatan Penggunaan

Nama Metode

Deskripsi

String getId()

Mendapatkan ID sesi saat ini. Waktu habis bacaan ID sesi default adalah 24 jam (h).

getTableIdentifier()

Mendapatkan nama tabel dalam sesi saat ini.

getStatus()

Mendapatkan status sesi saat ini.Nilai status adalah sebagai berikut:

  • INIT: Nilai awal yang ditetapkan saat sesi dibuat.

  • NORMAL: Sesi berhasil dibuat.

  • CRITICAL: Pembuatan sesi gagal.

  • EXPIRED: Sesi telah habis waktu.

readSchema()

Mendapatkan informasi struktur tabel dari sesi saat ini. DataSchema didefinisikan sebagai berikut:

public class DataSchema implements Serializable {
    
    List<Column> getColumns();

    List<String> getPartitionKeys();

    List<String> getColumnNames();

    List<TypeInfo> getColumnDataTypes();

    Optional<Column> getColumn(int columnIndex);

    Optional<Column> getColumn(String columnName);

}
  • getColumns(): Mendapatkan informasi Kolom dari tabel dan partisi yang akan dibaca.

  • getPartitionKeys(): Mendapatkan nama Kolom dari partisi yang akan dibaca.

  • getColumnNames(): Mendapatkan nama Kolom dari tabel dan partisi yang akan dibaca.

  • getColumnDataTypes(): Mendapatkan informasi Kolom dari tabel dan partisi yang akan dibaca.

  • getColumn(int columnIndex): Mendapatkan objek Kolom berdasarkan indeks. Jika indeks di luar rentang Kolom saat ini, maka akan mengembalikan kosong.

  • getColumn(String columnName): Mendapatkan objek Kolom berdasarkan parameter columnName. Jika Kolom tabel saat ini tidak mengandung columnName, maka akan mengembalikan kosong.

getInputSplitAssigner()

Mendapatkan InputSplitAssigner dari sesi saat ini. Antarmuka InputSplitAssigner mendefinisikan metode untuk menetapkan instance InputSplit dalam sesi pembacaan saat ini. Setiap InputSplit mewakili segmen data yang dapat diproses oleh satu SplitReader. InputSplitAssigner didefinisikan sebagai berikut:

public interface InputSplitAssigner {

    int getSplitsCount();

    long getTotalRowCount();

    InputSplit getSplit(int index);

    InputSplit getSplitByRowOffset(long startIndex, long numRecord);
}
  • getSplitsCount(): Mendapatkan jumlah segmen data yang terkandung dalam sesi.

    Catatan

    Ketika SplitOptions adalah SplitByByteSize, nilai pengembalian antarmuka ini lebih besar atau sama dengan 0.

  • getTotalRowCount(): Mendapatkan jumlah baris data yang terkandung dalam sesi.

    Catatan

    Ketika SplitOptions adalah SplitByByteSize, nilai pengembalian antarmuka ini lebih besar atau sama dengan 0.

  • getSplit(int index): Mendapatkan InputSplit yang sesuai berdasarkan parameter segmen data yang ditentukan Index. Rentang nilai parameter index adalah: [0,SplitsCount-1].

  • getSplitByRowOffset(long startIndex, long numRecord): Mendapatkan InputSplit yang sesuai. Deskripsi parameternya adalah sebagai berikut:

    • startIndex: Menentukan indeks awal baris data yang dibaca oleh InputSplit. Rentang nilainya adalah [0,RecordCount-1].

    • numRecord: Menentukan jumlah baris data yang dibaca oleh InputSplit.

// 1. Jika SplitOptions adalah SplitByByteSize

TableBatchReadSession scan = ...;
InputSplitAssigner assigner = scan.getInputSplitAssigner();
int splitCount = assigner.getSplitsCount();
for (int k = 0; k < splitCount; k++) {
    InputSplit split = assigner.getSplit(k);
    ...
}

// 2. Jika SplitOptions adalah SplitByRowOffset
TableBatchReadSession scan = ...;
InputSplitAssigner assigner = scan.getInputSplitAssigner();
long rowCount = assigner.getTotalRowCount();
long recordsPerSplit = 10000;
for (long offset = 0; offset < numRecords; offset += recordsPerSplit) {
    recordsPerSplit = Math.min(recordsPerSplit, numRecords - offset);
    InputSplit split = assigner.getSplitByRowOffset(offset, recordsPerSplit);
    ...
}

createRecordReader(InputSplit split, ReaderOptions options)

Membangun objek SplitReader<ArrayRecord>. ReaderOptions didefinisikan sebagai berikut:

public class ReaderOptions {
    
    public static ReaderOptions.Builder newBuilder() {
        return new Builder();
    }

    public static class Builder {

        public Builder withMaxBatchRowCount(int maxBatchRowCount);

        public Builder withMaxBatchRawSize(long batchRawSize);

        public Builder withCompressionCodec(CompressionCodec codec);

        public Builder withBufferAllocator(BufferAllocator allocator);

        public Builder withReuseBatch(boolean reuseBatch);

        public Builder withSettings(EnvironmentSettings settings);

        public ReaderOptions build();
    }

}
  • withMaxBatchRowCount(int maxBatchRowCount): Menentukan jumlah maksimum baris dalam setiap batch data yang dikembalikan oleh server. Nilai maksimum default dari parameter maxBatchRowCount adalah 4096.

  • withMaxBatchRawSize(long batchRawSize): Menentukan jumlah maksimum byte mentah yang terkandung dalam setiap batch data yang dikembalikan oleh server.

  • withCompressionCodec(CompressionCodec codec): Menentukan tipe kompresi data. Hanya tipe kompresi ZSTD dan LZ4_FRAME yang didukung.

    Catatan
    • Saat mentransmisikan sejumlah besar data Arrow yang tidak dikompresi secara langsung, waktu transmisi data mungkin meningkat secara signifikan karena keterbatasan lebar pita jaringan.

    • Jika tipe kompresi tidak ditentukan, kompresi data tidak dilakukan secara default.

  • withBufferAllocator(BufferAllocator allocator): Menentukan alokator memori untuk membaca data Arrow.

  • withReuseBatch(boolean reuseBatch): Menentukan apakah memori ArrowBatch dapat digunakan kembali. Parameter reuseBatch memiliki nilai berikut:

    • true (default): Memori ArrowBatch dapat digunakan kembali.

    • false: Memori ArrowBatch tidak dapat digunakan kembali.

  • withSettings(EnvironmentSettings settings): Menentukan informasi lingkungan runtime.

createArrowReader(InputSplit split, ReaderOptions options)

Membangun objek SplitReader<VectorSchemaRoot>.

SplitReader

Antarmuka SplitReader digunakan untuk membaca data dari tabel MaxCompute.

Definisi Antarmuka

public interface SplitReader<T> {

    boolean hasNext() throws IOException;

    T get();

    Metrics currentMetricsValues();

    void close() throws IOException;
}

Catatan Penggunaan

Nama Metode

Deskripsi

hasNext()

Memeriksa apakah ada item data lain untuk dibaca. Jika ada item data berikutnya untuk dibaca, maka mengembalikan true. Jika tidak, mengembalikan false.

get()

Mendapatkan item data saat ini. Sebelum memanggil metode ini, Anda harus memastikan bahwa ada elemen berikutnya dengan menggunakan metode hasNext().

currentMetricsValues()

Mendapatkan metrik terkait SplitReader.

close()

Menutup koneksi setelah pembacaan selesai.

Contoh Penggunaan

  1. Siapkan lingkungan untuk terhubung ke layanan MaxCompute.

    // AccessKey ID dan AccessKey Secret dari akun Alibaba Cloud atau RAM user
    // Pasangan AccessKey dari akun Alibaba Cloud memiliki izin pada semua operasi API. Menggunakan kredensial ini untuk melakukan operasi merupakan operasi berisiko tinggi. Kami merekomendasikan Anda menggunakan RAM user untuk memanggil operasi API atau melakukan pemeliharaan rutin. Untuk membuat RAM user, masuk ke konsol RAM
    // Dalam contoh ini, AccessKey ID dan AccessKey secret disimpan dalam variabel lingkungan. Anda juga dapat menyimpan pasangan AccessKey dalam file konfigurasi sesuai dengan kebutuhan bisnis Anda
    // Kami merekomendasikan Anda untuk tidak secara langsung menentukan AccessKey ID dan AccessKey secret dalam kode untuk mencegah kebocoran pasangan AccessKey
    private static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
    private static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
    //Nama Quota yang digunakan untuk mengakses MaxCompute
    String quotaName = "<quotaName>";
    //Nama proyek MaxCompute
    String project = "<project>";
    //Buat objek Odps untuk terhubung ke layanan MaxCompute
    Account account = new AliyunAccount(accessId, accessKey);
    Odps odps = new Odps(account);
    odps.setDefaultProject(project);
    //Alamat koneksi layanan MaxCompute. Hanya jaringan VPC Alibaba Cloud yang didukung
    odps.setEndpoint(endpoint);
    Credentials credentials = Credentials.newBuilder().withAccount(odps.getAccount()).withAppAccount(odps.getAppAccount()).build();
    EnvironmentSettings settings = EnvironmentSettings.newBuilder().withCredentials(credentials).withServiceEndpoint(odps.getEndpoint()).withQuotaName(quotaName).build();
    Catatan
    • Untuk mendapatkan nama kuota untuk grup sumber daya Data Transmission Service eksklusif (langganan) , ikuti langkah-langkah berikut:

    • Untuk otorisasi kuota tingkat pekerjaan, secara default, semua akun, termasuk akun Alibaba Cloud dan peran, tidak memiliki izin. Otorisasi diperlukan. Untuk detail tentang otorisasi, lihat Otorisasi.

  2. Lakukan operasi pembacaan tabel.

    1. Buat sesi pembacaan data untuk mengakses data MaxCompute.

      //Nama tabel yang sesuai dengan proyek MaxCompute
      String tableName = "<table.name>";
      //Buat sesi pembacaan data tabel
      TableReadSessionBuilder scanBuilder = new TableReadSessionBuilder();
      TableBatchReadSession scan = scanBuilder.identifier(TableIdentifier.of(project, tableName)).withSettings(settings)
              .withSplitOptions(SplitOptions.newBuilder()
                      .SplitByByteSize(256 * 1024L * 1024L)
                      .withCrossPartition(false).build())
              .requiredDataColumns(Arrays.asList("timestamp"))
              .requiredPartitionColumns(Arrays.asList("pt1"))
              .buildBatchReadSession();
      Catatan

      Dalam skenario dengan volume data besar, latensi jaringan, atau ketidakstabilan, pembuatan sesi pembacaan data mungkin memakan waktu lama, sehingga proses otomatis beralih ke mode asinkron untuk pembuatan sesi.

    2. Telusuri data MaxCompute untuk setiap segmen, gunakan pembaca Arrow untuk membaca dan menampilkan isi data setiap segmen secara berurutan.

      //Telusuri semua data segmen input dan gunakan pembaca Arrow untuk membaca batch data di setiap segmen satu per satu, dan akhirnya menampilkan isi setiap batch data
      InputSplitAssigner assigner = scan.getInputSplitAssigner();
      for (InputSplit split : assigner.getAllSplits()) {
          SplitReader<VectorSchemaRoot> reader =
                  scan.createArrowReader(split, ReaderOptions.newBuilder()
                          .withSettings(settings)
                          .withCompressionCodec(CompressionCodec.ZSTD)
                          .withReuseBatch(true)
                          .build());
      
          int rowCount = 0;
          List<VectorSchemaRoot> batchList = new ArrayList<>();
          while (reader.hasNext()) {
              VectorSchemaRoot data = reader.get();
              rowCount += data.getRowCount();
              System.out.println(data.contentToTSVString());
          }
          reader.close();
      }

Referensi

Untuk informasi lebih lanjut tentang pengenalan API Penyimpanan MaxCompute , lihat Ikhtisar API Penyimpanan.