读写ORC文件
Apache ORC项目提供了一个标准的开源列式存储格式,用于数据分析系统。最初是为了在Apache Hadoop中使用,随后被Apache Drill、Apache Hive、Apache Impala和Apache Spark等系统采用为高性能数据IO的共享标准。
Apache Arrow是用于读取或写入ORC文件的理想内存表示层。
另请参见
ORC读取器/写入器API参考。
支持的ORC特性 ORC格式有许多特性,我们支持其中的一部分。
数据类型
以下是ORC类型和映射的Arrow类型的列表。
(1) 在读取时,ORC类型将被读取为表中表中的第一个对应的Arrow类型。
(2) 在写入时,如果提供了时区,ORC TIMESTAMP_INSTANT 将被使用,否则将使用ORC TIMESTAMP。在读取时,ORC TIMESTAMP和TIMESTAMP_INSTANT 类型都将被读取为Arrow Timestamp类型,arrow::TimeUnit::NANO,并且时区仅对ORC TIMESTAMP_INSTANT类型设置为UTC。
(3) 在读取时,ORC CHAR和VARCHAR类型都将被读取为Arrow String类型。ORC CHAR和VARCHAR类型不支持写入。
压缩
压缩编解码器
SNAPPY
GZIP/ZLIB
LZ4
ZSTD
不支持的压缩编解码器:LZO。
读取ORC文件
ORCFileReader类将整个文件或条纹的数据读取到一个::arrow::Table中。
ORCFileReader ORCFileReader类需要一个表示输入文件的::arrow::io::RandomAccessFile实例。
#include <arrow/adapters/orc/adapter.h>{ // ... arrow::Status st; arrow::MemoryPool* pool = default_memory_pool(); std::shared_ptr<arrow::io::RandomAccessFile> input = ...; // 打开ORC文件读取器 auto maybe_reader = arrow::adapters::orc::ORCFileReader::Open(input, pool); if (!maybe_reader.ok()) { // 处理文件读取器实例化错误... } std::unique_ptr<arrow::adapters::orc::ORCFileReader> reader = maybe_reader.ValueOrDie(); // 将整个文件读取为单个Arrow表 auto maybe_table = reader->Read(); if (!maybe_table.ok()) { // 处理读取ORC数据错误... } std::shared_ptr<arrow::Table> table = maybe_table.ValueOrDie(); }
写入ORC文件 ORCFileWriter 将ORC文件写入OutputStream。
#include <arrow/adapters/orc/adapter.h>{ // 单次写入 // ... std::shared_ptr<arrow::io::OutputStream> output = ...; auto writer_options = WriterOptions(); auto maybe_writer = arrow::adapters::orc::ORCFileWriter::Open(output.get(), writer_options); if (!maybe_writer.ok()) { // 处理文件写入器实例化错误... } std::unique_ptr<arrow::adapters::orc::ORCFileWriter> writer = maybe_writer.ValueOrDie(); if (!(writer->Write(*input_table)).ok()) { // 处理写入错误... } if (!(writer->Close()).ok()) { // 处理关闭错误... } }