AlteryxでS3から複数ファイルを取得する
こんにちは、小澤です。
今回は、AlteryxからS3にある複数のファイルをまとめて取得する方法を紹介したいと思います。
Amazon S3 Downloadツール
AlteryxにはAmazon S3 DownloadツールというS3のファイルを取得するためのツールがあります。
このツールは以下のような設定になっており、
- アクセスキー
- シークレットキー
- バケット名
- ファイル名
といった項目を入れることでS3上にあるファイルを取得することができます。
しかし、このツールでは「*」のようなワイルドカードでの指定ができないため、1ファイルしか取得することができません。 Hadoopで生成したファイルを使いたいなど、データが複数ファイルに分割されている時にこれでは困ってしまいます。
複数ファイルをまとめて1つのデータとして取得する方法
これに対する、複数ファイルの取得方法として、Alteryxのコミュニティでやり方が紹介されています。
バッチマクロを利用することで実現可能との記載があり、具体的なワークフローも添付されています。 バッチマクロの作成はAlteryxの中でも高度な機能となりますので、それがどのような動きをするのかも合わせて解説していきたいと思います。
今回はマクロとワークフローの2つが登場します。
マクロの内容は以下のようになります。
ワークフローとしての基本的な流れは
- Amazon S3 DownloadツールでS3からファイルを取得
- Formulaツールでカラムを追加(何を追加するかは後ほど)
- Macro Outputツールで出力
という簡単なものになっています。 今回特殊なのは、バッチマクロでのみ利用可能なControl Parameterツールです。
Control Parameterツールはコントロール用のパラメータを制御するためのツールになるのですが、その動きはこのマクロがワークフローからどのように使われるのか確認しながら見ていくことにします。
ワークフロー側の構成は以下のようになります。
一番左側のText Inputツールでは、取得したいファイルがあるS3のバケット名とフォルダ名を指定しています。
ここで指定するフォルダはその中にさらにサブフォルダがあっても問題ありません。
続いてのFormulaツールでは、バケット名、フォルダ名からAWSCLIを使ってS3上にあるファイルを取得するコマンドを生成しています。
生成されるコマンドは以下のようになります。
aws s3 ls s3:/// --recursive > \list.txt
これは、指定したフォルダ以下のファイルを再帰的に取得して適当なファイルにリダイレクトしているものとなります。
そのあとのSelectツールでは、元のデータのバケット名、フォルダ名はこの先は必要ないので削除しています。
その次のRun Commandツールで作成したコマンドを利用して、S3のファイル一覧を取得しています。 設定は以下のようになっています。
Run Commandツールの設定の詳細はここでは解説しませんので、以下をご覧ください。
処理の流れとしては、
- コマンドが記載されたデータをバッチファイルとして出力
- そのバッチファイルを実行
- リダイレクトによって生成されたファイルを次のツールのインプットとして利用
となります。
ファイル出力設定では、以下のように
- CSVファイルとして出力
- 区切り文字なし
- ヘッダ行なし
を設定するようにしてください。
また、awsコマンドを実行するためコマンドのパスを通しておく(あるいはフルパスで指定する)ことと、aws configureでアクセスするために必要な情報をあらかじめ設定しておく必要があります。
出力ファイルは以下のようになっており、結果がそのまま取得されているのが確認できます。
ここから必要なファイル名のみを抜き出すために、Text To Columnsツールを使ってスペースで区切ってやります。
これは、1つのデータを特定の文字で区切って別々な列に分けるためのツールです。 今回は以下のような設定をしています。
「Field to Split」には、分割したい列を指定します。
「Delimiters」では区切り文字を指定します。今回はスペースのため、わかりづらくなっていますが半角スペースを入れています。
「Split to Columns」か「Split to Rows」かの選択では、分割したデータを縦持ち・横持ちのどちらにするか選択をします。 縦持ち・横持ちがどういったものかについては、以下の内容もあわせてご確認ください。
今回のデータでは、日時とファイルサイズの間に複数の空白が入っているので、「Skip Empty Fields」にチェックを入れることで、それらを省略して含めないようにしています。
出力結果は以下のようになります。
今回は、Text To Columnsツールを利用しましたが、Run CommandツールのRead Resultsの設定でdelimiterをスペースにしておくことでも可能です。
その先のSelectツールでファイル名の列のみにして、Filterツールで取得したいファイルのみに絞り込んでいます。
さて、続いてはいよいよ先ほど作成したマクロを利用しています。 先ほどのマクロでは、Macro Inputツールを利用していませんでしたが、ここでは1つの入力を受け付けています。 これが、Control Parameterに与えられるデータとなります。 今回の場合だと、S3上のファイル名一覧を渡しています。
バッチマクロでControl Parameterに渡されたデータは1行づつ渡され、マクロ内の処理が実行されます。 データが3行あれば、このパラメータを変えて3回実行しているようなイメージです。
ここで改めて、マクロの内容を確認してみます。
Control Parameterから渡された情報は、Actionツールを使って、Amazon S3 Downloadツールの設定の一部を書き換えています。
ここで、取得するファイルを書き換えているため、先ほどワークフローで取得したファイルを全て取得できる、ということになります。
また、FormulaツールにもControl Parameterツールをつなげており、どのファイルのデータだったかをfile_name列として追加しています。
一通りの結果は最後にUnion結合されて、マクロを呼び出したワークフロー側に結果が返されます。
おわりに
今回はAlteryxのバッチマクロを使って、S3から複数のファイルを取得する方法を解説しました。
バッチマクロを使うと処理の流れが複雑になるため、イメージしづらかった方もいるかもしれません。 バッチマクロはAlteryxでできることの中でも難しい部類に入るため、いきなり理解しようとはせず、使い方に慣れて徐々に高度がことができるようになってきたあたりでやってみるのがいいのではないかと思います。
Alteryxに興味をお持ちいただいた方はこちらからお問い合わせください。