我收到了一个具有以下架构的镶木地板文件:
我使用一个简单的 python 脚本转储了模式:
#! /usr/bin/env python3
import pyarrow as pa
import pyarrow.parquet as pq
import sys
schema = pq.read_schema(sys.argv[1])
print(schema)
我的问题是:
date32[day]
是什么 C++ 类型?我仔细查看了一下,似乎底层数据类型是 int32_t。但如果我尝试使用这种类型来阅读它,我会得到:
terminate called after throwing an instance of 'parquet::ParquetException'
what(): Column converted type mismatch. Column 'Date' has converted type 'DATE' not 'INT_32'
我也尝试过使用字符串,但出现此错误:
terminate called after throwing an instance of 'parquet::ParquetException'
what(): Column physical type mismatch. Column 'Date' has physical type 'INT32' not 'BYTE_ARRAY'
这是我的代码:
#include <iostream>
#include "arrow/io/file.h"
#include "parquet/stream_reader.h"
#include "readfile.h"
int main(int argc, char **argv)
{
if (argc < 2)
{
std::cout << "Usage: " << argv[0] << " <input filename" << std::endl;
exit(2);
}
char *input_filename = argv[1];
std::cout << "Input filename is " << input_filename << std::endl;
std::shared_ptr<arrow::io::ReadableFile> infile;
PARQUET_ASSIGN_OR_THROW(
infile,
arrow::io::ReadableFile::Open(input_filename));
parquet::StreamReader os{parquet::ParquetFileReader::Open(infile)}
std::string name;
std::string ident;
int32_t date;
std::string ts_event_utc;
while (!os.eof())
{
os >> name >> ident >> date >> ts_event_utc >> parquet::EndRow;
}
看起来当前的 StreamReader 没有可以与
date32[day]
运算符一起使用的 >>
映射。 (有关检查和添加这些映射的代码,请参阅here)。
理论上,您可以在那里添加覆盖,或者将 DATE 类型添加到文件顶部的例外中。任一者都允许流读取器解码 date32 值。
与此同时,您可能必须使用较低级别的列读取器界面(您将使用
TypedColumnReader<Int32Type>
)或(更简单的路线)您可以使用位于parquet::arrow::FileReader
中的parquet/arrow/reader.h
直接读取数据进入 Arrow Arrays 或 RecordBatches 甚至 arrow::Table
。
综上所述,请在 github.com/apache/arrow 上提交问题以跟踪
StreamReader
不支持日期值!如果您想提交 PR 来修复它,我很乐意为您审核!