Q:Apache Arrow阵列构建器UnsafeAppend

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Q:Apache Arrow阵列构建器UnsafeAppend相关的知识,希望对你有一定的参考价值。

我正在使用数组生成器UnsafeAppend api。根据文档中的代码。

arrow::Int64Builder builder;
// Make place for 8 values in total
builder.Resize(8);
builder.UnsafeAppend(1);
builder.UnsafeAppend(2);
builder.UnsafeAppend(3);
builder.UnsafeAppendNull();
builder.UnsafeAppend(5);
builder.UnsafeAppend(6);
builder.UnsafeAppend(7);
builder.UnsafeAppend(8);

std::shared_ptr<arrow::Array> array;
arrow::Status st = builder.Finish(&array);

Builder.Resize(i)应该为i值腾出空间。将i更改为另一个值(例如100000000)后,我应该有100000000个值的空间。我的编译器出现分段错误,这很奇怪。我进行了另一个实验,将构建器的大小调整为10。构建器应该只能有10个空间,但是我的代码可以成功地向构建器追加甚至超过10的值。

我有点困惑,构建器是否应该使用api Resize(i)精确地拥有空间i。有人知道使用UnsafeAppend API的任何正确方法吗?

int row = 100000000
arrow::StringBuilder b1;
b1.Resize(row);
for(int i=0;i<row;i++)

   std::string str = "test";
   b1.UnsafeAppend(str);


答案

Resize(n)n条目保留空间,但不为字符数据保留空间(arrow::StringBuilder::UnsafeAppend要求)。对于您的示例,我建议:

int row = 100000000
arrow::StringBuilder b1;

b1.Resize(row);

std::string str = "test";
b1.ReserveData(row * str.size());

for(int i=0;i<row;i++)

   b1.UnsafeAppend(str);

以上是关于Q:Apache Arrow阵列构建器UnsafeAppend的主要内容,如果未能解决你的问题,请参考以下文章

Apache Arrow 简介

在pyspark中使用pandas udf/apache Arrow

JS面试Q&A(续2): Rest parameter,Arrow function 等

如何在 Pyspark 中启用 Apache Arrow

行业资讯Apache Arrow 1.0.0 发布,内存数据交换格式

Apache Arrow 内存数据交换格式