Apache Arrow Java 有原生 S3 文件系统实现吗?

问题描述 投票:0回答:2

我正在 Java 中使用 Apache Arrow,我想知道 java 库中是否有一种实现可以提供本机 S3 文件系统实现,就像使用 S3FileSystem 的 Arrow (pyarrow) 的 Python 实现中提供的那样。我浏览了 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)

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

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

amazon-s3 arrow-functions pyarrow apache-arrow
2个回答
1
投票

Arrow Java 似乎并未为云提供商提供纯粹的原生

FileSystem
支持。

另一种选择是使用 Arrow Java Dataset 模块,该模块提供了一个工厂,支持通过

FileSystemDatasetFactory
JNI 类从外部文件系统读取数据。

我们将使用此 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
  • GS ror 错误如
    Got GCS URI but Arrow compiled without GCS support
    考虑添加 (
    -DARROW_GCS=ON
    )
  • 还支持HDFS

0
投票

不确定这是否有助于您的特定要求,但我们使用 NIO 实现了一个开源 Java 文件系统提供程序,称为 s3fs-nio。您可以使用它来读取文件并将其写入 AWS S3 存储桶。

将其与 Apache Arrow 集成将是一个不同的故事,但应该是可能的。

© www.soinside.com 2019 - 2024. All rights reserved.