在Luigi中,假设我有TaskA和TaskB,它们各自生成一列要放入table1中的数据。如果我使用SQL目标,Luigi似乎希望写入整个表,但这会使向表中添加新列的过程很慢。想象一下table1填充了A和B列。我想添加一个新的字段C,该字段可以由taskC输出,但是我宁愿直接将其写入SQL表,因为否则我必须存储A, B,C在其他地方,还有另一个任务,将它们全部读取并写入表中。有没有一种方法可以做到,而不必在其他地方复制数据库,而是让每个任务只将其数据写入SQL表的适当列中?
最佳答案
如果我使用SQL目标,那么Luigi似乎要写入整个表
我认为您误解了Target
是什么。它不“做事”,仅用于向luigi发出Task
是否完成的信号。
据我了解,我认为您正在尝试使用诸如this one之类的CopyToTable
任务之一,而这些任务确实是为每次运行填充几行而设计的,因此,如果您希望仅填充一列,则应该创建自己的Task
,并编写自己的SQL查询。
幸运的是,您仍然可以使用SQL目标作为输出,并从中获得与数据库的连接。
例
在这里,我使用MySqlTarget
作为目标,但是您可以使用其他SQL目标。
class WriteSingleColumnTask(lg.Task):
def output():
return MySqlTarget(
host=self.host,
database=self.database,
user=self.user,
password=self.password,
table=self.table,
update_id=self.update_id
)
def run():
output=self.output()
connection = output.connect()
connection.autocommit = self.autocommit
cursor = connection.cursor()
query = "<YOUR QUERY FOR A SINGLE COLUMN HERE>"
cursor.execute(sql)
# Update marker table
self.output().touch(connection)
# commit and close connection
connection.commit()
connection.close()
here中的示例。
关于python - 如何将Luigi与SQL表的特定列一起用作目标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56544817/