我正在 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 中提供这些功能?
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();
}
}
}
考虑:
Got GCS URI but Arrow compiled without GCS support
考虑添加 (-DARROW_GCS=ON
)不确定这是否有助于您的特定要求,但我们使用 NIO 实现了一个开源 Java 文件系统提供程序,称为 s3fs-nio。您可以使用它来读取文件并将其写入 AWS S3 存储桶。
将其与 Apache Arrow 集成将是一个不同的故事,但应该是可能的。