如何在Apache Arrow C++中按条件筛选arrow::table的行?
在Apache Arrow C++中实现日期过滤(等效于Pandas的
df[df['certain_date'] > '2023-05-26']) 当然可行,你需要用Arrow Compute的比较函数而非is_in(is_in用于集合匹配,不适合范围比较)。以下是完整实现步骤和代码示例:
核心步骤
- 将目标日期字符串转换为Arrow兼容的日期类型(通常用
date32,对应自1970-01-01的天数) - 调用
arrow::compute::Greater函数对日期列和目标日期做比较,生成布尔过滤掩码 - 用
arrow::compute::Filter函数将原表应用掩码,得到过滤后的结果表
完整代码示例
#include <arrow/api.h> #include <arrow/compute/api.h> #include <arrow/compute/api_vector.h> #include <arrow/result.h> #include <iostream> arrow::Result<std::shared_ptr<arrow::Table>> FilterDateColumn( const std::shared_ptr<arrow::Table>& input_table, const std::string& column_name, const std::string& target_date_str) { // 1. 获取目标日期列 auto date_column = input_table->GetColumnByName(column_name); if (!date_column) { return arrow::Status::Invalid("Column not found: ", column_name); } // 2. 将目标日期字符串转换为date32类型的标量 arrow::Date32Scalar target_date; auto parse_status = arrow::ParseDate32(target_date_str, &target_date.value); if (!parse_status.ok()) { return parse_status; } // 3. 生成过滤掩码:日期列 > 目标日期 ARROW_ASSIGN_OR_RAISE(auto mask, arrow::compute::Greater(*date_column, target_date)); // 4. 应用掩码过滤表 ARROW_ASSIGN_OR_RAISE(auto filtered_table, arrow::compute::Filter(*input_table, mask)); return filtered_table; } int main() { // 示例:创建一个包含日期列的测试表 auto date_values = arrow::Date32Array::FromVector({ arrow::Date32(arrow::GetDate32("2023-05-20")), arrow::Date32(arrow::GetDate32("2023-05-27")), arrow::Date32(arrow::GetDate32("2023-06-01")), arrow::Date32(arrow::GetDate32("2023-05-25")) }); auto schema = arrow::schema({arrow::field("certain_date", arrow::date32())}); auto input_table = arrow::Table::Make(schema, {date_values}); // 执行过滤 auto result = FilterDateColumn(input_table, "certain_date", "2023-05-26"); if (!result.ok()) { std::cerr << "Filter failed: " << result.status().message() << std::endl; return 1; } // 打印结果表 std::cout << "Filtered table:" << std::endl; result.ValueOrDie()->Print(); return 0; }
关键说明
- 日期类型:示例中用
date32(32位整数存储天数),如果你的日期列是date64(存储毫秒级时间戳),只需替换Date32Scalar为Date64Scalar,ParseDate32为ParseDate64即可。 - Compute函数:
arrow::compute::Greater支持日期类型的比较,内部会自动处理日期的数值转换逻辑。 - 错误处理:示例用
ARROW_ASSIGN_OR_RAISE宏简化Arrow的Result/Status错误处理,这是Arrow C++开发的标准做法。
内容的提问来源于stack exchange,提问作者Abhishek Kumar
相关产品推荐
相关产品推荐

