如何使用 C++ 从 parquet 文件中读取“date32[day]”类型?

问题描述 投票:0回答:1

我收到了一个具有以下架构的镶木地板文件:

  • 名称:字符串
  • 标识:字符串
  • 日期:date32[日]
  • 事件时间戳:时间戳[我们]

我使用一个简单的 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;      
}
c++ parquet apache-arrow
1个回答
0
投票

看起来当前的 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 来修复它,我很乐意为您审核!

© www.soinside.com 2019 - 2024. All rights reserved.