c++ - Apache ORC 在读取数据时跳过条纹
问题描述
我正在尝试读取驻留在 S3 存储中的 ORC 文件。但是,我不想扫描/读取整个文件,而是它的特定部分。比如一个ORC文件大小是1GB,我想处理scan-range
400到400000。
为此,我阅读了 ORC 文件的页脚并获取所有条纹的偏移量。
所以,我知道哪些是必需的条纹。例如,我只想访问条带 4 和 5。有没有办法跳过 ORC 文件的一些条带?
我的代码如下:
std::string file_path = "./tt.orc";
orc::RowReaderOptions row_reader_opts;
row_reader_opts.include(read_cols);
orc::ReaderOptions reader_opts;
reader_opts.getSerializedFileTail();
std::unique_ptr<orc::Reader> reader = orc::createReader(orc::readFile(file_path), reader_opts);
std::cout << reader->getFileFooterLength() << std::endl;
std::unique_ptr<orc::RowReader> row_reader = reader->createRowReader(row_reader_opts);
std::unique_ptr<orc::ColumnVectorBatch> batch = row_reader->createRowBatch(4);
//double field
auto *fields = dynamic_cast<orc::StructVectorBatch *>(batch.get());
std::cout << fields->fields.size() << std::endl;
std::cout << fields->fields[0]->toString() << std::endl;
std::cout << fields->fields[1]->toString() << std::endl;
auto *col0 = dynamic_cast<orc::DoubleVectorBatch *>(fields->fields[0]);
double *buffer1 = col0->data.data();
//string field
auto *col4 = dynamic_cast<orc::StringVectorBatch *>(fields->fields[4]);
char **buffer2 = col4->data.data();
long long *lengths = col4->length.data();
while (row_reader->next(*batch)) {
for (uint32_t r = 0; r < batch->numElements; ++r) {
std::cout << "line " << buffer1[r] << "," << std::string(buffer2[r], lengths[r]) << "\n";
}
//std::cout << "this batch nums" << " " << batch->numElements << " " << "lines\n";
}
解决方案
推荐阅读
- apache-flink - 有没有关于 SQL flink 支持什么的官方文档
- c++ - 杀死监听 TCP 端口的流氓进程
- reactjs - 使用 React 处理条件类的最佳方法是什么
- azure - Azure DevOps 类、结构或接口成员声明中的无效令牌“=>”
- android - 首次使用 android studio 时出错“未注册 URI(设置 | 语言和框架 | 架构和 DTD)”
- django - 空白和空白后的字符未在 GET 请求中传递
- angularjs - 使用文本框和单选按钮以过滤 ng-repeat Angularjs 中的表的问题
- angular - Ag 网格使用 aggFunc 自定义组行单元格
- java - 从本地文件的 WSDL 和 xsd 生成 java 代码的替代方法
- c# - 通过 DataGridView 保存对数据库的更改