
複数のローカルファイルを参照してみる | Luigi Advent Calendar 2016 #05
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
好物はインフラとフロントエンドのかじわらゆたかです。
このエントリは『Luigi Advent Calendar 2016』5日目の内容となります。
今回はローカルファイルを参照していきたいと思います。
先日4日目はローカルファイルを参照してみるでした。
今回は参照するファイルが単数ではなく、複数のファイルを参照する処理を実施してみたいと思います。
下準備
前回と同様のTSVファイルを用います。
複数ファイルの処理を行うため、今回は2つのファイルを用意しました。
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
複数のローカルファイルの参照
前回、ローカルファイルの参照について行いました。
ローカルファイルの参照は、作ったクラス内の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
最後に実装したタスクとその実行結果を掲載しておきます。
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 =====
まとめ
複数のファイルを扱う実装を行いました。
うまいことやるとワーカーに複数処理させたりといった事ができそうではあるのですが、なかなかに設計が大変そうな印象です。
明日は、参照したファイルを操作していきます。













