AlteryxのRツールで入力を受け取る際にデータを小分けにする

こんにちは、小澤です。

本日はAlteryxのRツールの話です!! Rツールを使ってて、処理をするのにデータ全体が必要ってわけじゃないけど、 メモリを大量消費する処理だから一度に大量のデータを受け取ると処理が失敗するかもしれない、 という場面で活躍する機能を紹介します。

Rツールでは一度に受け取るデータ件数を指定可能

Rツールでは、一度に受け取るデータ件数を指定する機能があります。 この仕組みを使えって例えば100件とすれば、入力が1000件あろうが100万件あろうが10億件あろうが、 先頭から100件までしか取得しません。

そうはいっても10億件全部処理対象なんだけど... となると思われます。 この仕組みでは、残ったたデータのうち次の100件を取得ということが可能ですので、 全てのデータに対して処理を行うことが可能になっています。

なお、データがメモリ上に残り続けれか不要になった際に削除されるかは、 処理の記述の仕方に依存しますので、その点はご注意ください。

さて、実際のやり方ですが最初に以下のように取得します。

data <- read.Alteryx.First("#1", 100, mode="data.frame")

通常利用する read.Alteryx ではなく、 read.Alteryx.First という関数を利用しています。 この関数には以下の3つの引数を指定しています。

引数名 指定している値 説明
name #1 データ取得元のコネクション名
nRecordLimit 100 一度に取得するデータ件数
mode data.frame 取得するときの型をdata.frameかlistで指定する

なお、read.Alteryx 関数同様、mode引数に関してはOptionalとなっており、デフォルトはdata.frameです。

関数名に"First"と入っていることからもわかる通りnRecordLimitで指定した行数分、 先頭からデータを取得します。

続いて、それ以降のデータを取得する方法も確認しましょう。 こちらは read.Alteryx.Next 関数を利用します。

read.Alteryx.Next("#1", mode="data.frame")

引数は read.Alteryx 関数と同じです。 こちらにはnRecordLimit引数はありません。 read.Alteryx.First で指定した値と同じ行数のデータを取得します。

read.Alteryx.Next 関数は呼び出すたびに前回取得分から次のnRecordLimitで指定した件数のデータを取得します。

例えばデータが315行であれば、

  1. read.Alteryx.First で最初の100行を取得
  2. read.Alteryx.Next で次の100行を取得
  3. read.Alteryx.Next でその次の100行を取得
  4. read.Alteryx.Next で最後の15行を取得
  5. read.Alteryx.Next を実行しても取得するデータが無いのでNULLが返ってくる

とすることで、すべてのデータを取得できます。

上記の流れの通り、データ件数がnRecordLimitで割り切れない時はさいぎょに取得される件数は剰余となります。 また、もうこれ以上取得するデータが存在しない時に read.Alteryx.Next 関数を呼び出すとNULLが返ってくるため、以下のようにループさせることですべてのデータに対する処理が行えます。

while (!is.null(data)) {
  data <- read.Alteryx.Next("#1", mode="data.frame")
  # 取得したデータに対する処理
}

出力はどうするか?

read.Alteryx.Firstread.Alteryx.Next 関数を利用することで、すべてのデータを丸ごと取得せずに処理を行う方法はわかったかと思います。

ここで問題となるのは出力はどうするかです。 せっかく入力を分割して取得しているのに、出力のためにすべてのデータを内部で保持する必要があればこの機能自体いらなくね?となってしまいます。

実はこちらは特別な関数などを用意する必要はありません。 write.Alteryx 関数は同じ出力先を複数回指定して処理を行うとそれらがUnion結合された結果が最終出力となります。 そのため、取得したデータ対して処理を行ったのち、毎回 write.Alteryx 関数を呼び出してしまえばいい、ということになるため以下のような記述が可能です。

read.Alteryx.Next("#1", mode="data.frame")
result <- ... # 取得したデータに対する処理
write.Alteryx(result, 1)

while (!is.null(data)) {
	data <- read.Alteryx.Next("#1", mode="data.frame")
  result <- ... # 取得したデータに対する処理
  write.Alteryx(result, 1)
}

なお、同じコネクションに対して複数回出力を行う場合、すべてのメタデータが同じになっている必要がありますので、その点はご注意ください。

おわりに

今回は、AlteryxのRツールで一度に受け取るデータ件数を制限する方法を紹介しました。

Rツール使ってるけどデータ件数が多すぎて... とお困りの方はぜひお試しください。

Alteryxの導入なら、クラスメソッドにおまかせください

日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。

alteryx_960x400