如何将arrow::Array转换为std::vector?

6

我有一个Apache arrow数组,是通过读取文件创建的。

std::shared_ptr<arrow::Array> array;
PARQUET_THROW_NOT_OK(reader->ReadColumn(0, &array));

有没有一种方法可以将其转换为 std::vector 或其他本地数组类型在 C++ 中?

2
根据文档,Apache arrow::Array是指向位图数据的指针。将其存储在vector<unsigned char>中完全可行,但您可能需要进行一些转换。arrow::Array类具有data()函数,返回指向ArrayData的共享指针,您可以调用get()并获取它所指向的数据,并使用arrow::Array的length函数和指针来构造您的vector,但您可能需要进行强制转换才能使其正常工作。这只是我的想法,我没有Apache Arrow库可用来验证其中任何内容。 - johnathan
我认为你是正确的,我需要获取原始指针并将其转换为预期类型,然后形成一个向量。 - motam79
嗨@motam79。你找到了一个干净的解决方案吗? - Wojciech Kulma
你为什么想把数组转换成向量?是否有任何 Arrow::Array 无法支持的操作或算法? - Jun
1个回答

3

您可以使用std::static_pointer_castarrow::Array转换为其它类型,例如将包含双精度浮点数的数组转换为arrow::DoubleArray,然后使用Value函数获取特定索引的值。例如:

auto arrow_double_array = std::static_pointer_cast<arrow::DoubleArray>(array);
std::vector<double> double_vector;
for (int64_t i = 0; i < array->length(); ++i) 
{
    double_vector.push_back(arrow_double_array->Value(i));
}

请见本示例中ColumnarTableToVector函数的后半部分:https://arrow.apache.org/docs/cpp/examples/row_columnar_conversion.html。在该示例中,table->column(0)->chunk(0)是一个std::shared_ptr<arrow::Array>
要了解更多信息,我发现单击此处的继承图树的各个部分很有用:https://arrow.apache.org/docs/cpp/classarrow_1_1_flat_array.html。例如,arrow::StringArray中的字符串使用GetString函数而不是Value函数进行访问。
这只是我从这些链接、约翰内斯的评论和自己尝试小示例中拼凑出来的,所以我不确定这是否是最佳方法,因为我对此还很陌生。

这段代码可能存在一个潜在问题,即它假设数组中的所有值都是非空的。如果我们假设没有原始值而使用循环,我认为你可以使用std::vector<double> double_vector(arrow_double_array->raw_values(), arrow_double_array->raw_values()+array->length()); 这样会更简洁(或者至少预先调整数组大小也是合适的)。 - Micah Kornfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接