【Red Data Tools開発者に聞け!】(第13回) 追加する新機能のイメージをおさらい

Red Data Tools

今回は【Red Data Tools開発者に聞け!】第13回目の振り返り記事になります!今回のお話はこれから追加していく新機能のイメージのおさらいになります。

Red Data Tools開発者に聞け!第17回 (Rubyバインディングに新機能を追加するシリーズpart12)

今回やったこと

  • これから追加する機能のおさらい

これから追加する機能のおさらい

Apache Arrow の Arrow::Table には既に行単位で ruby の配列を生成してリターンする raw_records という関数が実装されています。

以下の実行結果に示すように、表形式のデータを2次元の配列にして返します。

irb(main):006:0> Arrow::Table.new({ number1: [1, 2, 3], number2: [10, 20, 30] })
=>
#<Arrow::Table:0x10fdfcbd0 ptr=0x600002304dc0>
        number1 number2
0             1      10
1             2      20
2             3      30

irb(main):007:0> Arrow::Table.new({ number1: [1, 2, 3], number2: [10, 20, 30] }).raw_records
=> [[1, 10], [2, 20], [3, 30]]

しかし raw_records は全てのレコードが配列に変換されるまで結果を受け取ることができません。もし「結果を加工しながら配列に変換する」などといった処理を書きたい場合は、全てを配列に変換したのち、再びループを回して加工する、といった二度手間を踏むことになってしまいます。

もし、ruby の each メソッドのように結果を一行ずつ受け取って処理することができればこの問題は解決することができます。

実際に実現したいことを ruby で書いてみると以下のようなイメージですね。

class Arrow::Table
  def each_raw_record
    raw_records.each do |row|
      yield row
    end
  end
end

Arrow::Table.new(number: [1, 2, 3], number2: [10, 20, 30]).each_raw_record { |row| p row }

[1, 10]
[2, 20]
[3, 30]

追加した each_raw_record では結果を一行ずつイテレートして yield しています。このサンプルコードではブロックとして結果を標準出力する処理を渡していますので、コンソールに受け取った配列の内容が出力されています。

次回からは実際に C++ の方にこの機能を実装していきます!

引き続きウォッチしてみてくださいね!

コメント

タイトルとURLをコピーしました