apache / apache/arrow-java

[Java] How do I read encrypted Parquet files using Arrow?

未關閉
#207 2 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
Type: usage
主要語言
Java
星號
94
分支
152
平均合併
3 天 16 小時
30 天內合併 PR
11

描述

### Describe the usage question you have. Please include as many useful details as possible.

I want to read encrypted Parquet files using Arrow Java API to create an input stream for [DuckDB](https://github.com/duckdb/duckdb).

It works for Parquet files as shown below.

```java
import org.apache.arrow.c.ArrowArrayStream;
import org.apache.arrow.c.Data;
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.duckdb.DuckDBConnection;
import java.net.URI;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

URI uri = URI.create("file:/path/to/sample.parquet");

ScanOptions options = new ScanOptions(/*batchSize*/ 32768);
try (BufferAllocator allocator = new RootAllocator();
ArrowArrayStream stream = ArrowArrayStream.allocateNew(allocator);
DatasetFactory datasetFactory = new FileSystemDatasetFactory(allocator,
NativeMemoryPool.getDefault(), FileFormat.PARQUET, uri.toString());
Dataset dataset = datasetFactory.finish();
Scanner scanner = dataset.newScan(options);
ArrowReader reader = scanner.scanBatches();) {

Data.exportArrayStream(allocator, reader, stream);

Class.forName("org.duckdb.DuckDBDriver");
try (DuckDBConnection conn = (DuckDBConnection) DriverManager.getConnection("jdbc:duckdb:")) {
conn.registerArrowStream("testStream", stream);

try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM testStream")) {
// Do stuff with the resultset...
}
}
}
}
```

However, I haven't found how to do it for files encrypted using [Parquet modular encryption](https://github.com/apache/parquet-format/blob/master/Encryption.md). Arrow Python documentation shows some [examples](https://arrow.apache.org/docs/python/parquet.html#parquet-modular-encryption-columnar-encryption), but they don't exist for Java.

### Component(s)

Java

貢獻指南

開啟貢獻指南

研究方向

從所示的 Java 進入點開始—FileSystemDatasetFactory、FileFormat.PARQUET、Scanner 和 DuckDBConnection.registerArrowStream—並將它們與連結的 Parquet 模組化加密文件和 Arrow Python 範例進行比較。完成的標準是確立並記錄一種將加密 Parquet 資料讀入 DuckDB Arrow 串流的 Java 方法,或明確記錄該功能無法使用。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
java
領域
databases
Issue 類型
文件
難度
4/5
預估耗時
3-5 天
活躍度
停滯
描述清晰度
需要釐清
新手友好度
25/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。