Arrowでフィルタリング
問題
table:表の例
ID カテゴリー
1 A
2 B
3 C
4 A
5 B
6 C
みたいな表から、カテゴリーがBとCの物だけ取り出したい。
方針:Arrow::Table#slice
#sliceの使い方は、簡単なのはドキュメントを見れば分かるんだけど、ぱっと見、合いそうな物がない。怪しいのはブロックを使う物ぐらい。ただブロックバージョンはドキュメントを見ても使い方が分からないのでテストを見るのがよい。 行毎にRubyのブロックを呼び出していたら遅くて仕方がないから、内部では多分Arrowでの操作に変換しているんだろうけど、結構(Rubyとして)自然な書き方でフィルタリングできるので驚く。
こういうテストがあって、今回はこれが使えそう:
code:test-slicer.rb
test("column.in") do
sliced_table = @table.slice do |slicer|
end
assert_equal(<<-TABLE, sliced_table.to_s)
count visible
(uint32) (bool)
0 1 true
1 4 (null)
2 16 true
3 64 (null)
TABLE
end
今回はこうなる筈:
code:ruby
table = Arrow::Table.new(
)
slice = table.slice {|slicer| slicer.カテゴリー.in? interest_categories}
pp slice
code:出力
ID カテゴリー
(uint8) (utf8)
0 2 B
1 3 C
2 5 B
3 6 C