複数のローカルファイルを参照してみる | Luigi Advent Calendar 2016 #05

2016.12.05

はじめに

好物はインフラとフロントエンドのかじわらゆたかです。

このエントリは『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 =====

まとめ

複数のファイルを扱う実装を行いました。
うまいことやるとワーカーに複数処理させたりといった事ができそうではあるのですが、なかなかに設計が大変そうな印象です。
明日は、参照したファイルを操作していきます。