在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/

10-11 22:49
查看更多