我有一个luigi任务,该任务读取一个.sql文件并输出到BigQuery。
我的问题是,有什么方法可以在不复制整个luigi任务的情况下,用一个不同的.sql文件重用同一任务,即我想创建模板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):
...
答案 0 :(得分:1)
只需使用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
答案 1 :(得分:0)
基于@matagus的答案,您还可以使用父级的RunSql
,complete()
和requires()
方法来对run()
进行子类化以定义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
实例化该类一样