【问题标题】:re-use similar luigi tasks重复使用类似的 luigi 任务
【发布时间】:2019-01-29 12:32:57
【问题描述】:

我有一个 luigi 任务,它读取 .sql 文件并输出到 BigQuery。

我的问题是有什么方法可以用不同的 .sql 文件重复使用相同的任务,而不必复制整个 luigi 任务,即我想创建模板 luigi 任务的实例。

class run_sql(luigi.task):
    sql_file = 'path/to/sql/file'  # This is the only bit of code that changes 
    def complete(self):
        ...
    def requires(self):
        ...
    def run(self):
        ...

【问题讨论】:

    标签: python luigi


    【解决方案1】:

    基于@matagus 的回答,您还可以使用父类的complete()requires()run() 方法对RunSql 进行子类化以定义一个sql 文件。

    class RunSqlFile(RunSql):
        sql_file = '/path/to/file.sql`
    

    或者您可以使用@property 装饰器来引用RunSql 类的属性。我经常这样做是为了在父类中设置目录或其他配置数据,然后在子类中引用它们。

    class RunSql(luigi.Task):
        sql_file = luigi.Parameter()
    
        def get_file(self, name):
            default_dir = '/path/to/sql/dir'
            return os.path.join(default_dir, name)
    
       def requires(self):
            ...
    
    
    class RunSqlFile(RunTask):
    
        @property
        def sql_file(self):
            return self.get_file("query.sql")
    

    这就像你用--sql-file /path/to/sql/dir/query.sql实例化了这个类

    【讨论】:

      【解决方案2】:

      只需使用a parameter 指定文件的路径。像这样的:

      class RunSql(luigi.task):
      
          sql_file = luigi.Parameter()
      
          def complete(self):
              ...
      
          def requires(self):
              ...
      
          def run(self):
              ...
      

      要访问参数的值,只需在代码中使用 self.sql_file

      之后你可以这样运行你的任务:

      luigi RunSql --sql-file path/to/file.sql
      

      【讨论】:

      • 好吧,这是有道理的。如果我有多个 .sql 文件怎么办?我想以这样的方式构建管道,我不必重复代码并只更改 sql_file 参数。然后你会建议有一个 .sql 文件列表,然后 luigi 任务执行所有这些文件吗?
      • 您的任务可能会通过示例读取目录中的所有 *.sql 文件,然后为每个文件触发 RunSql 任务。
      • @HemeshPatel 如果是,请将答案标记为有效。见stackoverflow.com/help/someone-answers
      猜你喜欢
      • 2018-03-09
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多