如何将Parquet文件的LARGE_STRING列读取到C++字符串变量中
问题描述
我用Python Polars创建了一个Parquet文件,包含一列可变长度字符串,数据格式如下:
┌──────────┐ │ str_list │ │ --- │ │ str │ ╞══════════╡ │ ALV5 │ │ SMGWX │ │ NEGOT │ │ S2U0S │ │ … │ │ KFO │ │ LJ3J │ │ PCY6O │ │ GQ0W7 │ └──────────┘
用C++读取该文件时,发现列类型为LARGE_STRING,以下断言成立:
assert(record_batch->column(0)->type_id() == arrow::Type::LARGE_STRING)
我已将列转换为LargeStringArray:
auto strlist = std::static_pointer_cast<arrow::LargeStringArray>(record_batch->column(0));
但找不到合适的成员函数将数组中的字符串复制到自定义的字符串变量中。
解决方案
arrow::LargeStringArray继承自arrow::BinaryArray,可以通过以下方式提取字符串:
按索引提取单个字符串
使用Value()方法获取指定索引的arrow::util::string_view,再转换为std::string完成数据复制:for (int64_t i = 0; i < strlist->length(); ++i) { if (!strlist->IsNull(i)) { arrow::util::string_view sv = strlist->Value(i); std::string my_string(sv.data(), sv.size()); // 此处处理自定义字符串变量my_string } }简化提取写法
直接调用ToString()方法,内部已封装空值检查(空值会返回空字符串):for (int64_t i = 0; i < strlist->length(); ++i) { std::string my_string = strlist->ToString(i); // 此处处理自定义字符串变量my_string }批量提取所有字符串
如果需要一次性将所有非空字符串存入容器:std::vector<std::string> all_strings; all_strings.reserve(strlist->length()); for (int64_t i = 0; i < strlist->length(); ++i) { if (!strlist->IsNull(i)) { all_strings.emplace_back(strlist->Value(i)); } else { // 可自定义空值处理逻辑,比如插入空字符串或跳过 all_strings.emplace_back(""); } }
注意:Value()返回的string_view指向Arrow数组内部内存,若需要长期保存字符串,必须转换为std::string完成数据复制。
内容的提问来源于stack exchange,提问作者vinnewbie
相关产品推荐
相关产品推荐

