是否有一个本机S3文件系统的Apache Arrow Java实现?



我在Java中使用Apache Arrow,我想知道Java库中是否有一个实现,它提供了一个本地S3文件系统实现,就像Arrow (pyarrow)的Python实现中提供的那样,它使用S3FileSystem。我已经浏览了Arrow Java IPC文档,我没有看到任何这样的实现。

在Python中,使用pyarrow可以像这样从S3读取表:

import pyarrow.parquet as pq
# using a URI -> filesystem is inferred
pq.read_table("s3://my-bucket/data.parquet")
# using a path and filesystem
s3 = fs.S3FileSystem(..)
pq.read_table("my-bucket/data.parquet", filesystem=s3)

我想知道谷歌云存储文件系统(GcsFileSystem)和Hadoop分布式文件系统(HDFS)是否也实现了类似的功能。

如果Java中没有可用的本机实现,是否计划在Java中提供任何即将发布的或测试版本来提供这些功能?

似乎Arrow Java并没有为云提供商提供纯粹的本地FileSystem支持。

另一个选择是使用Arrow Java Dataset模块,它提供了一个工厂,支持通过FileSystemDatasetFactoryJNI类从外部文件系统读取数据。

我们将在演示中使用S3/GS uri:

- aws s3 ls s3://voltrondata-labs-datasets/nyc-taxi-tiny/year=2022/month=2/part-0.parquet
- gsutil ls gs://voltrondata-labs-datasets/nyc-taxi-tiny/year=2022/month=2/part-0.parquet

让我们使用这个Arrow Java Dataset Cookbook进行测试:

import org.apache.arrow.dataset.file.FileFormat;
import org.apache.arrow.dataset.file.FileSystemDatasetFactory;
import org.apache.arrow.dataset.jni.NativeMemoryPool;
import org.apache.arrow.dataset.scanner.ScanOptions;
import org.apache.arrow.dataset.scanner.Scanner;
import org.apache.arrow.dataset.source.Dataset;
import org.apache.arrow.dataset.source.DatasetFactory;
import org.apache.arrow.memory.BufferAllocator;
import org.apache.arrow.memory.RootAllocator;
import org.apache.arrow.vector.ipc.ArrowReader;
import org.apache.arrow.vector.types.pojo.Schema;
public class DatasetModule {
public static void main(String[] args) {
String uri = "s3://voltrondata-labs-datasets/nyc-taxi-tiny/year=2022/month=2/part-0.parquet"; // AWS S3
// String uri = "hdfs://{hdfs_host}:{port}/nyc-taxi-tiny/year=2022/month=2/part-0.parquet"; // HDFS
// String uri = "gs://voltrondata-labs-datasets/nyc-taxi-tiny/year=2022/month=2/part-0.parquet"; // Google Cloud Storage
ScanOptions options = new ScanOptions(/*batchSize*/ 32768);
try (
BufferAllocator allocator = new RootAllocator();
DatasetFactory datasetFactory = new FileSystemDatasetFactory(allocator, NativeMemoryPool.getDefault(), FileFormat.PARQUET, uri);
Dataset dataset = datasetFactory.finish();
Scanner scanner = dataset.newScan(options);
ArrowReader reader = scanner.scanBatches()
) {
Schema schema = scanner.schema();
System.out.println(schema);
while (reader.loadNextBatch()) {
System.out.println("RowCount: " + reader.getVectorSchemaRoot().getRowCount());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

考虑:

  • S3默认包含
  • Got GCS URI but Arrow compiled without GCS support这样的GS误差考虑添加(-DARROW_GCS=ON)
  • HDFS也支持

最新更新