この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
好物はインフラとフロントエンドのかじわらゆたかです。
このエントリは『Luigi Advent Calendar 2016』5日目の内容となります。
今回はローカルファイルを参照していきたいと思います。
先日4日目はローカルファイルを参照してみるでした。
今回は参照するファイルが単数ではなく、複数のファイルを参照する処理を実施してみたいと思います。
下準備
前回と同様のTSVファイルを用います。
複数ファイルの処理を行うため、今回は2つのファイルを用意しました。
customer0.tsv
1 Customer#000000001 IVhzIApeRb MOROCCO 0 MOROCCO AFRICA 25-989-741-2988 BUILDING
2 Customer#000000002 XSTf4,NCwDVaWNe6tE JORDAN 1 JORDAN MIDDLE EAST 23-768-687-3665 AUTOMOBILE
3 Customer#000000003 MG9kdTD ARGENTINA7 ARGENTINA AMERICA 11-719-748-3364 AUTOMOBILE
4 Customer#000000004 XxVSJsL EGYPT 4 EGYPT MIDDLE EAST 14-128-190-5944 MACHINERY
5 Customer#000000005 KvpyuHCplrB84WgAi CANADA 5 CANADA AMERICA 13-750-942-6364 HOUSEHOLD
6 Customer#000000006 sKZz0CsnMD7mp4Xd0YrBvx SAUDI ARA2 SAUDI ARABIA MIDDLE EAST 30-114-968-4951 AUTOMOBILE
7 Customer#000000007 TcGe5gaZNgVePxU5kR CHINA 0 CHINA ASIA 28-190-982-9759 AUTOMOBILE
8 Customer#000000008 I0B10bB0AymmC, 0PrRYBC PERU 6 PERU AMERICA 27-147-574-9335 BUILDING
9 Customer#000000009 xKiAFTjUsCuxfele INDIA 6 INDIA ASIA 18-338-906-3675 FURNITURE
10 Customer#000000010 6LrEaV6KR6PLVcgl2ArL ETHIOPIA 9 ETHIOPIA AFRICA 15-741-346-9870 HOUSEHOLD
customer1.tsv
11 Customer#000000011 PkWS 3HlXqwTuz UNITED KI3 UNITED KINGDOM EUROPE 33-464-151-3439 BUILDING
12 Customer#000000012 9PWKuhzT JORDAN 5 JORDAN MIDDLE EAST 23-791-276-1263 HOUSEHOLD
13 Customer#000000013 nsXQu0oVjD7PM6 CANADA 8 CANADA AMERICA 13-761-547-5974 BUILDING
14 Customer#000000014 KXkletMlL ARGENTINA0 ARGENTINA AMERICA 11-845-129-3851 FURNITURE
15 Customer#000000015 YtWggXoOLdwdo7b0y,BZaGU UNITED KI0 UNITED KINGDOM EUROPE 33-687-542-7601 HOUSEHOLD
16 Customer#000000016 cYiaeMLZSMA IRAN 5 IRAN MIDDLE EAST 20-781-609-3107 FURNITURE
17 Customer#000000017 izrh 6jdqtp2eqdtbkswDD8 BRAZIL 6 BRAZIL AMERICA 12-970-682-3487 AUTOMOBILE
18 Customer#000000018 3txGO AiuFux3zT FRANCE 0 FRANCE EUROPE 16-155-215-1315 BUILDING
19 Customer#000000019 uc,3bHIx84H,wdrmLO CHINA 3 CHINA ASIA 28-396-526-5053 HOUSEHOLD
20 Customer#000000020 JrPk8Pq RUSSIA 0 RUSSIA EUROPE 32-957-234-8742 FURNITURE
複数のローカルファイルの参照
前回、ローカルファイルの参照について行いました。
ローカルファイルの参照は、作ったクラス内のoutputメソッドの戻り値として指定する必要があります。
複数ファイルを参照する場合もこの考え方は変わりません。
そのため、ファイル参照側はファイル名をパラメータで指定できるようにし、
パラメータで指定したファイル名をoutputメソッドの戻り値として指定すると言った挙動になります。
import luigi
class TsvInput(luigi.Task):
filename = luigi.Parameter()
def output(self):
return luigi.LocalTarget(self.filename)
次に、実際にファイルの中身を参照するタスクの実装ですが、
今回は参照対象のファイルが2つあるため、それらを配列に含めてrequireメソッド内で指定します。
class TsvColumnShow(luigi.Task):
def requires(self):
return [TsvInput('customer{}.tsv'.format(d)) for d in range(2)]
上記のようにすることで、runメソッド内のinputメソッドで配列として取得することができます。
あとは配列から要素を取り出し、ファイルとして参照していくといった実装をすれば指定した複数ファイルを処理することが可能です。
def run(self):
for t in self.input():
with t.open('r') as in_file:
for line in in_file:
print line
最後に実装したタスクとその実行結果を掲載しておきます。
UseTsv.py
import luigi
class TsvInput(luigi.Task):
filename = luigi.Parameter()
def output(self):
return luigi.LocalTarget(self.filename)
class TsvColumnShow(luigi.Task):
def requires(self):
return [TsvInput('customer{}.tsv'.format(d)) for d in range(2)]
def run(self):
for t in self.input():
with t.open('r') as in_file:
for line in in_file:
print line
実行結果
$ python ./UseTsv.py --local-scheduler TsvColumnShow
DEBUG: Checking if TsvColumnShow() is complete
/Users/kajiwarayutaka/.pyenv/versions/luigiStudy/lib/python2.7/site-packages/luigi/worker.py:295: UserWarning: Task TsvColumnShow() without outputs has no custom complete() method
is_complete = task.complete()
DEBUG: Checking if TsvInput(filename=customer0.tsv) is complete
DEBUG: Checking if TsvInput(filename=customer1.tsv) is complete
INFO: Informed scheduler that task TsvColumnShow__99914b932b has status PENDING
INFO: Informed scheduler that task TsvInput_customer1_tsv_164d145f3e has status DONE
INFO: Informed scheduler that task TsvInput_customer0_tsv_3630d0d21c has status DONE
INFO: Done scheduling tasks
INFO: Running Worker with 1 processes
DEBUG: Asking scheduler for work...
DEBUG: Pending tasks: 1
INFO: [pid 11716] Worker Worker(salt=251995595, workers=1, host=HL00088.local, username=kajiwarayutaka, pid=11716) running TsvColumnShow()
1 Customer#000000001 IVhzIApeRb MOROCCO 0 MOROCCO AFRICA 25-989-741-2988 BUILDING
2 Customer#000000002 XSTf4,NCwDVaWNe6tE JORDAN 1 JORDAN MIDDLE EAST 23-768-687-3665 AUTOMOBILE
3 Customer#000000003 MG9kdTD ARGENTINA7 ARGENTINA AMERICA 11-719-748-3364 AUTOMOBILE
4 Customer#000000004 XxVSJsL EGYPT 4 EGYPT MIDDLE EAST 14-128-190-5944 MACHINERY
5 Customer#000000005 KvpyuHCplrB84WgAi CANADA 5 CANADA AMERICA 13-750-942-6364 HOUSEHOLD
6 Customer#000000006 sKZz0CsnMD7mp4Xd0YrBvx SAUDI ARA2 SAUDI ARABIA MIDDLE EAST 30-114-968-4951 AUTOMOBILE
7 Customer#000000007 TcGe5gaZNgVePxU5kR CHINA 0 CHINA ASIA 28-190-982-9759 AUTOMOBILE
8 Customer#000000008 I0B10bB0AymmC, 0PrRYBC PERU 6 PERU AMERICA 27-147-574-9335 BUILDING
9 Customer#000000009 xKiAFTjUsCuxfele INDIA 6 INDIA ASIA 18-338-906-3675 FURNITURE
10 Customer#000000010 6LrEaV6KR6PLVcgl2ArL ETHIOPIA 9 ETHIOPIA AFRICA 15-741-346-9870 HOUSEHOLD
11 Customer#000000011 PkWS 3HlXqwTuz UNITED KI3 UNITED KINGDOM EUROPE 33-464-151-3439 BUILDING
12 Customer#000000012 9PWKuhzT JORDAN 5 JORDAN MIDDLE EAST 23-791-276-1263 HOUSEHOLD
13 Customer#000000013 nsXQu0oVjD7PM6 CANADA 8 CANADA AMERICA 13-761-547-5974 BUILDING
14 Customer#000000014 KXkletMlL ARGENTINA0 ARGENTINA AMERICA 11-845-129-3851 FURNITURE
15 Customer#000000015 YtWggXoOLdwdo7b0y,BZaGU UNITED KI0 UNITED KINGDOM EUROPE 33-687-542-7601 HOUSEHOLD
16 Customer#000000016 cYiaeMLZSMA IRAN 5 IRAN MIDDLE EAST 20-781-609-3107 FURNITURE
17 Customer#000000017 izrh 6jdqtp2eqdtbkswDD8 BRAZIL 6 BRAZIL AMERICA 12-970-682-3487 AUTOMOBILE
18 Customer#000000018 3txGO AiuFux3zT FRANCE 0 FRANCE EUROPE 16-155-215-1315 BUILDING
19 Customer#000000019 uc,3bHIx84H,wdrmLO CHINA 3 CHINA ASIA 28-396-526-5053 HOUSEHOLD
20 Customer#000000020 JrPk8Pq RUSSIA 0 RUSSIA EUROPE 32-957-234-8742 FURNITURE
INFO: [pid 11716] Worker Worker(salt=251995595, workers=1, host=HL00088.local, username=kajiwarayutaka, pid=11716) done TsvColumnShow()
DEBUG: 1 running tasks, waiting for next task to finish
INFO: Informed scheduler that task TsvColumnShow__99914b932b has status DONE
DEBUG: Asking scheduler for work...
DEBUG: Done
DEBUG: There are no more tasks to run at this time
INFO: Worker Worker(salt=251995595, workers=1, host=HL00088.local, username=kajiwarayutaka, pid=11716) was stopped. Shutting down Keep-Alive thread
INFO:
===== Luigi Execution Summary =====
Scheduled 3 tasks of which:
* 2 present dependencies were encountered:
- 2 TsvInput(filename=customer0.tsv,customer1.tsv)
* 1 ran successfully:
- 1 TsvColumnShow()
This progress looks :) because there were no failed tasks or missing external dependencies
===== Luigi Execution Summary =====
まとめ
複数のファイルを扱う実装を行いました。
うまいことやるとワーカーに複数処理させたりといった事ができそうではあるのですが、なかなかに設計が大変そうな印象です。
明日は、参照したファイルを操作していきます。