MaxCompute; EMR üzerindeki Spark, StarRocks, Presto, PAI ve Hologres gibi üçüncü taraf motorların bir SDK aracılığıyla Storage API'yi çağırmasına ve MaxCompute verilerine doğrudan erişmesine olanak tanır. Bu konuda, Java SDK kullanarak MaxCompute'a erişim için kod örnekleri sunulmaktadır.
Genel Bakış
Java SDK kullanarak MaxCompute'a erişmek için kullanılan ana arayüzler aşağıdaki tabloda listelenmiştir.
|
|
|
|
|
|
|
|
|
|
|
Maven kullanıyorsanız, Java SDK'nın farklı sürümlerini elde etmek için Maven deposunda odps-sdk-table-api araması yapın. İlgili yapılandırma aşağıdaki gibidir.
<dependency>
<groupId>com.aliyun.odps</groupId>
<artifactId>odps-sdk-table-api</artifactId>
<version>0.48.8-public</version>
</dependency>
MaxCompute, open storage ile ilgili API'ler sağlar. Daha fazla bilgi için bkz. odps-sdk-table-api.
TableReadSessionBuilder
TableReadSessionBuilder arayüzü, bir MaxCompute tablo okuma oturumu oluşturur. Ana yöntemler aşağıda tanımlanmıştır. Daha fazla bilgi için bkz. Java-sdk-doc.
Arayüz tanımı
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();
}
Yöntem açıklamaları
Yöntem Adı | Açıklama |
| Girdi Table parametresini geçerli oturumun hedef tablosu olarak ayarlar. |
| Girdi TableIdentifier parametresini geçerli oturumun hedef tablosu olarak ayarlar. |
| Belirtilen alanlardan veri okur. Döndürülen verideki alan sırası, Not
|
| Bir tablonun belirtilen bölümlerindeki belirtilen sütunlardan veri okur. Bölüm budama işlemi için bu yöntemi kullanın. Not
|
| Bir tablonun belirtilen bölümlerinden veri okur. Bölüm budama işlemi için bu yöntemi kullanın. Not
|
| Belirtilen paketlerden veri okur. Bu yöntem yalnızca kümelenmiş tablolar için geçerlidir ve paket budama işlemi için kullanılır. Not
|
| Tablo verilerini böler. Daha fazla bilgi için bkz. SplitOptions. |
| Arrow veri seçeneklerini belirtir. Daha fazla bilgi için bkz. ArrowOptions. |
| Yüklem itme seçeneklerini belirtir. Daha fazla bilgi için bkz. Predicate. |
| Ortam bağlamını belirtir. Daha fazla bilgi için bkz. EnvironmentSettings. |
| Mevcut bir oturumu yeniden yüklemek için oturum kimliğini belirtir. |
| Bir tablo okuma oturumu oluşturur veya alır.
Not Oturum oluşturma yüksek ek yüke sahiptir ve dosya sayısı büyük olduğunda uzun zaman alabilir. |
TableBatchReadSession
TableBatchReadSession arayüzü, MaxCompute tablosundan veri okumak için bir oturumu temsil eder. Ana yöntemler aşağıda tanımlanmıştır.
Arayüz tanımı
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;
}
Yöntem açıklamaları
Yöntem Adı | Açıklama |
| Oturum kimliğini alır. Varsayılan oturum zaman aşımı 24 saattir. |
| Geçerli oturum için tablo adını alır. |
| Oturum durumunu alır. Geçerli değerler:
|
| Geçerli oturum için tablo şemasını alır. Daha fazla bilgi için bkz. DataSchema. |
| Geçerli oturum için InputSplitAssigner öğesini alır. InputSplitAssigner, geçerli okuma oturumundaki InputSplit örneklerini atamak için yöntemleri tanımlar. Her InputSplit, tek bir SplitReader tarafından işlenebilen bir veri bölümünü temsil eder. Daha fazla bilgi için bkz. InputSplitAssigner. |
| Bir |
| Bir |
SplitReader
SplitReader arayüzü tablolardan veri okur.
Arayüz tanımı
public interface SplitReader<T> {
boolean hasNext() throws IOException;
T get();
Metrics currentMetricsValues();
void close() throws IOException;
}
Yöntem açıklamaları
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Örnekler
-
MaxCompute'a bağlanmak için ortamı yapılandırın.
// AccessKey ID and AccessKey secret of an Alibaba Cloud account or a RAM user // An Alibaba Cloud account AccessKey grants full API access and poses high security risks. We strongly recommend creating and using a RAM user for API access or routine O&M. Log on to the RAM console to create a RAM user. // This example stores the AccessKey and AccessKey secret in environment variables. They can also be stored in a configuration file as needed. // Never store AccessKey and AccessKey secret in code because of the risk of key leakage. private static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); private static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); // Quota name for accessing MaxCompute String quotaName = "<quotaName>"; // MaxCompute project name String project = "<project>"; // Create an Odps object to connect to MaxCompute Account account = new AliyunAccount(accessId, accessKey); Odps odps = new Odps(account); odps.setDefaultProject(project); // Endpoint for MaxCompute. Only Alibaba Cloud VPC networks are supported. 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(); -
Yetkilendirme.
Varsayılan olarak hiçbir hesabın (Alibaba Cloud hesapları dahil) veya rolün iş düzeyinde kotaları belirtme izni yoktur. Gerekli izinleri verin. Daha fazla bilgi için bkz. Open Storage'a Genel Bakış.
-
Tablo verilerini okuyun.
-
MaxCompute verilerini okumak için bir veri okuma oturumu oluşturun.
// Table name in the MaxCompute project String tableName = "<table.name>"; // Create a table data read session 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();NotVeri hacmi büyükse veya ağ gecikme süresi yüksek ya da kararsızsa, bir veri okuma oturumu oluşturmak çok uzun sürebilir ve otomatik olarak eşzamansız bir sürece geçebilir.
-
Her bölümdeki MaxCompute verilerini yineleyin ve her bölümden veri okumak için bir Arrow okuyucu kullanın ve verileri çıktı olarak alın.
// Traverse all input partitions, use an Arrow reader to read each batch of data from every partition, and output the content of each batch 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(); }
-
İlgili nesneler ve arayüzler
SplitOptions
SplitOptions
-
Parametre tanımı
SplitOptions nesne parametreleri aşağıdaki gibi tanımlanmıştır:
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(); } } -
Parametre açıklamaları
-
SplitByByteSize(long splitByteSize)Verileri belirtilen splitByteSize parametresine göre böler. Sunucu tarafından döndürülen her veri bölümünün boyutu splitByteSize değerini (bayt cinsinden) aşmaz.
Özel bölme boyutu en az 10 × 1024 × 1024 (10 MB) olmalıdır.
Bölme boyutunu özelleştirmek için
SplitByByteSize(long splitByteSize)kullanılmazsa sistem varsayılan 256 × 1024 × 1024 (256 MB) değerini kullanır.
-
SplitByRowOffset()Verileri satıra göre böler ve istemcinin belirtilen bir dizinden veri okumasına olanak tanır.
-
withCrossPartition(boolean crossPartition)Tek bir veri parçasının birden fazla veri bölümü içermesine izin verilip verilmeyeceğini belirtir. crossPartition parametresi aşağıdaki değerleri kabul eder:
true (varsayılan): Tek bir veri parçasının birden fazla veri bölümü içermesine izin verir.
false: İzin vermez.
-
withMaxFileNum(int splitMaxFileNum)Bir tablonun çok sayıda dosyası olduğunda daha fazla veri bölümü oluşturmak için tek bir veri bölümündeki maksimum fiziksel dosya sayısını belirtin.
Varsayılan olarak tek bir veri bölümündeki fiziksel dosya sayısı üzerinde bir sınır yoktur.
build(): Bir SplitOptions nesnesi oluşturur.
-
-
Örnekler
// 1. Split data by size, set SplitSize to 256 MB SplitOptions splitOptionsByteSize = SplitOptions.newBuilder().SplitByByteSize(256 * 1024L * 1024L).build() // 2. Split data by RowOffset SplitOptions splitOptionsCount = SplitOptions.newBuilder().SplitByRowOffset().build() // 3. Set the maximum number of files in a single split to 1 SplitOptions splitOptionsCount = SplitOptions.newBuilder().SplitByRowOffset().withMaxFileNum(1).build()
ArrowOptions
ArrowOptions
-
Parametre tanımı
ArrowOptions nesne parametreleri aşağıdaki gibi tanımlanmıştır:
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; } } -
Parametre açıklamaları
-
TimestampUnitTimestamp ve Datetime veri türleri için birimi belirtir. Geçerli değerler:
SECOND: saniye (s)
MILLI: milisaniye (ms)
MICRO: mikrosaniye (μs)
NANO: nanosaniye (ns)
-
withTimestampUnit(TimestampUnit unit)Timestamp veri türü için birimi belirtir. Varsayılan: NANO.
-
withDatetimeUnit(TimestampUnit unit)Datetime veri türü için birimi belirtir. Varsayılan: MILLI.
-
-
Örnekler
ArrowOptions options = ArrowOptions.newBuilder() .withDatetimeUnit(ArrowOptions.TimestampUnit.MILLI) .withTimestampUnit(ArrowOptions.TimestampUnit.NANO) .build()
Predicate
Predicate
-
Parametre tanımı
Predicate nesne parametreleri aşağıdaki gibi tanımlanmıştır:
// 1. Binary operations public class BinaryPredicate extends Predicate { public enum Operator { /** * Binary operation operators */ 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. Unary operations public class UnaryPredicate extends Predicate { public enum Operator { /** * Unary operation operators */ IS_NULL("is null"), NOT_NULL("is not null"); } public static UnaryPredicate isNull(Serializable operand); public static UnaryPredicate notNull(Serializable operand); } ### 3. IN and NOT IN public class InPredicate extends Predicate { public enum Operator { /** * IN and NOT IN operators for set membership check */ 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. Column names public class Attribute extends Predicate { public Attribute(Object value); public static Attribute of(Object value); } // 5. Constants public class Constant extends Predicate { public Constant(Object value); public static Constant of(Object value); } // 6. Compound operations public class CompoundPredicate extends Predicate { public enum Operator { /** * Compound predicate operators */ 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); } // 7. Raw predicates (RawPredicate) // If existing methods do not meet requirements, assemble predicates based on SQL syntax public class RawPredicate extends Predicate { public RawPredicate(String rawExpr); public static RawPredicate of(String rawExpr); } -
Örnekler
// 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))); // 4. Use RawPredicate to assemble predicates (supports all types) Predicate predicate = RawPredicate.of("c1 > 20000 and c2 < 100000");
EnvironmentSettings
EnvironmentSettings
-
Parametre tanımı
EnvironmentSettings arayüzü aşağıdaki gibi tanımlanmıştır:
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(); } } -
Parametre açıklamaları
-
withDefaultProject(String projectName)Proje adını ayarlar.
projectNameprojectName parametresi MaxCompute proje adıdır.MaxCompute konsolu adresinde oturum açın ve sol üst köşedeki bölgeyi değiştirin.
seçeneğine giderek MaxCompute proje adını görüntüleyin.
-
withDefaultSchema(String schema)Varsayılan şemayı ayarlar. schema parametresi MaxCompute şema adıdır. Şemalar hakkında daha fazla bilgi için bkz. Şema işlemleri.
-
withServiceEndpoint(String endPoint)Hizmet uç noktasını ayarlar.Uç noktalar.
-
withTunnelEndpoint(String tunnelEndPoint)Tünel uç noktasını ayarlar.Uç noktalar.
-
withQuotaName(String quotaName)Kullanılacak kota adını belirtir.
MaxCompute iki kaynak türünü destekler: özel Data Transmission Service kaynak grupları (abonelik) Kota adını aşağıdaki gibi alın:
-
Özel Data Transmission Service kaynak grubu
MaxCompute konsolu adresinde oturum açın ve sol üst köşede bir bölge seçin.
Sol gezinme bölmesinde seçeneğine gidin.
Kullanılabilir kotaları görüntüleyin. Daha fazla bilgi için bkz. Hesaplama kaynakları - Kota yönetimi.
-
MaxCompute konsolu adresinde oturum açın ve sol üst köşede bir bölge seçin.
Sol gezinme bölmesinde seçeneğine gidin.
Tenant Property sekmesinde Storage API Switch anahtarını etkinleştirin.
-
-
withCredentials(Credentials credentials)Kimlik doğrulama bilgilerini belirtir. Daha fazla bilgi için bkz. Credentials.
-
Credentials
Credentials
-
Nesne tanımı
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(); } } -
Parametre açıklamaları
-
withAccount(Account account)Odps Account nesnesini belirtir.
-
withAppAccount(AppAccount appAccount)Odps appAccount nesnesini belirtir.
-
withAppStsAccount(AppStsAccount appStsAccount)Odps appStsAccount nesnesini belirtir.
-
withRestOptions(RestOptions restOptions)Ağ erişimi yapılandırmasını belirtir. RestOptions aşağıdaki gibi tanımlanmıştır:
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): userAgent bilgilerini belirtir.withConnectTimeout(int connectTimeout): Altta yatan ağ bağlantısının kurulması için bağlantı zaman aşımını belirtir. Varsayılan: 10 saniye.withReadTimeout(int readTimeout): Altta yatan ağ bağlantısı için okuma zaman aşımını belirtir. Varsayılan: 120 saniye.
-
DataSchema
-
DataSchema aşağıdaki gibi tanımlanmıştır:
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); } -
Parametre açıklamaları
getColumns(): Okunacak tablo ve bölümler için sütun bilgilerini alır.getPartitionKeys(): Okunacak bölüm sütun adlarını alır.getColumnNames(): Okunacak tablo ve bölümler için sütun adlarını alır.getColumnDataTypes(): Okunacak tablo ve bölümler için sütun veri türlerini alır.getColumn(int columnIndex): Bir sütun nesnesini dizine göre alır. Dizin aralık dışındaysa boş döndürür.getColumn(String columnName): Bir sütun nesnesini ada göre alır. Sütun adıcolumnNametabloda yoksa boş döndürür.columnName
InputSplitAssigner
-
InputSplitAssigner aşağıdaki gibi tanımlanmıştır:
public interface InputSplitAssigner { int getSplitsCount(); long getTotalRowCount(); InputSplit getSplit(int index); InputSplit getSplitByRowOffset(long startIndex, long numRecord); } -
Parametre açıklamaları
-
getSplitsCount(): Oturumdaki veri bölümü sayısını alır.NotSplitOptions SplitByByteSize olduğunda bu yöntem 0'dan büyük veya 0'a eşit bir değer döndürür.
-
getTotalRowCount(): Oturumdaki toplam veri satırı sayısını alır.NotSplitOptions SplitByByteSize olduğunda bu yöntem 0'dan büyük veya 0'a eşit bir değer döndürür.
getSplit(int index): Belirtilen bölümIndexiçin InputSplit öğesini alır.indexparametresi[0,SplitsCount-1]aralığındadır.getSplitByRowOffset(long startIndex, long numRecord): İlgili InputSplit öğesini alır. Parametreler şöyledir:startIndex: InputSplit veri okuma için başlangıç satır dizini. Aralık:[0,RecordCount-1].numRecord: InputSplit'in okuyacağı veri satırı sayısı.
-
-
Örnekler
// 1. If SplitOptions is SplitByByteSize TableBatchReadSession scan = ...; InputSplitAssigner assigner = scan.getInputSplitAssigner(); int splitCount = assigner.getSplitsCount(); for (int k = 0; k < splitCount; k++) { InputSplit split = assigner.getSplit(k); ... } // 2. If SplitOptions is 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); ... }
ReaderOptions
-
ReaderOptions aşağıdaki gibi tanımlanmıştır:
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(); } } -
Parametre açıklamaları
-
withMaxBatchRowCount(int maxBatchRowCount)Sunucu tarafından döndürülen toplu iş başına maksimum satır sayısını belirtir.
maxBatchRowCountparametresi varsayılan olarak en fazla 4096'dır. -
withMaxBatchRawSize(long batchRawSize)Sunucu tarafından döndürülen toplu iş başına maksimum ham bayt boyutunu belirtir.
-
withCompressionCodec(CompressionCodec codec)Veri sıkıştırma türünü belirtir. Yalnızca ZSTD ve LZ4_FRAME desteklenir.
NotBüyük miktarda sıkıştırılmamış Arrow verisini doğrudan aktarmak, ağ bant genişliği sınırları nedeniyle aktarım süresini önemli ölçüde artırabilir.
Sıkıştırma türü belirtilmezse veriler varsayılan olarak sıkıştırılmaz.
-
withBufferAllocator(BufferAllocator allocator)Arrow verilerini okumak için bellek ayırıcıyı belirtir.
-
withReuseBatch(boolean reuseBatch)ArrowBatch belleğinin yeniden kullanılıp kullanılamayacağını belirtir.
reuseBatchDeğerler:true (varsayılan): ArrowBatch belleği yeniden kullanılabilir.
false: ArrowBatch belleği yeniden kullanılamaz.
-
withSettings(EnvironmentSettings settings)Çalışma zamanı ortam bilgilerini belirtir.
-
Referanslar
MaxCompute open storage hakkında daha fazla bilgi için bkz. Open Storage'a Genel Bakış.