Есть ли способ получить фильтр из Arrow::Array и некоторого предиката?

#c #apache-arrow

#c #apache-стрелка

Вопрос:

Предположим, что у меня есть Arrow::Array (или Dataframe или ChunkedArray , не важно) и у меня есть некоторый предикат. Я хочу вычислить новый Arrow::BooleanArray , который просто хранит результат этого предиката, применяемого к каждому элементу массива.

Мой случай заключается в том, что у меня есть два отсортированных массива date32 , и я хочу вернуть маску, которая сообщает мне, присутствует ли значение первого массива во втором. Например, следующее:

 std::shared_ptr<arrow::BooleanArray> getDatesMask(
    const std::shared_ptr<arrow::Array>amp; lhs,
    const std::shared_ptr<arrow::Array>amp; lhs) 
{
   // some pseudo code how this could work
   // for date in lhs:
   //     res.Append(date in rhs);
   // return res;
}
 

Комментарии:

1. Не точное совпадение, но будет ли полезен set_difference в алгоритме?

2. set_difference . Обратите внимание, что есть также std::set_intersection и другие std::set_ связанные с алгоритмом функции.

Ответ №1:

Похоже, вам нужна функция is_in вычисления:

 std::shared_ptr<arrow::BooleanArray> getDatesMask(
    const std::shared_ptr<arrow::Array>amp; haystack,
    const std::shared_ptr<arrow::Array>amp; needles)
{
  arrow::Datum mask = arrow::compute::IsIn(haystack, needles).ValueOrDie();
  return std::static_pointer_cast<arrow::BooleanArray>(mask.make_array());
}
 

Документация is_in (и другие вычислительные функции) по адресу: https://arrow.apache.org/docs/cpp/compute.html#containment-tests

Комментарии:

1. Это работает, единственный комментарий заключается в том, что нужно добавить #include <arrow/compute/api_scalar.h>