Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 气流DAG-如何先检查BQ(必要时删除),然后运行数据流作业?_Python_Google Cloud Platform_Google Bigquery_Airflow_Google Cloud Composer - Fatal编程技术网

Python 气流DAG-如何先检查BQ(必要时删除),然后运行数据流作业?

Python 气流DAG-如何先检查BQ(必要时删除),然后运行数据流作业?,python,google-cloud-platform,google-bigquery,airflow,google-cloud-composer,Python,Google Cloud Platform,Google Bigquery,Airflow,Google Cloud Composer,我正在使用cloud composer为到达GCS并将其发送到BigQuery的文件编排ETL。我有一个cloud函数,当文件到达时触发dag,cloud函数将文件名/位置传递给dag。在我的DAG中,我有两项任务: 1)使用DataflowPythonOperator运行数据流作业,该作业从GCS中的文本读取数据,并将其转换并输入到BQ中,2)根据作业失败还是成功,将文件移动到失败/成功存储桶中。 每个文件都有一个文件ID,它是bigquery表中的一列。有时一个文件会被编辑一次或两次(这不是

我正在使用cloud composer为到达GCS并将其发送到BigQuery的文件编排ETL。我有一个cloud函数,当文件到达时触发dag,cloud函数将文件名/位置传递给dag。在我的DAG中,我有两项任务:

1)使用
DataflowPythonOperator
运行数据流作业,该作业从GCS中的文本读取数据,并将其转换并输入到BQ中,2)根据作业失败还是成功,将文件移动到失败/成功存储桶中。 每个文件都有一个文件ID,它是bigquery表中的一列。有时一个文件会被编辑一次或两次(这不是一个经常进行流式处理的事情),我希望能够首先删除该文件的现有记录

我查看了其他气流操作符,但希望在运行数据流作业之前在DAG中有两个任务:

  • 根据文件名获取文件id(现在我有一个bigquery表映射文件名->文件id,但我也可以引入一个json作为映射,如果这更容易的话)
  • 如果bigquery表(从数据流作业输出转换数据的表)中已经存在文件ID,请将其删除,然后运行数据流作业,以便获得最新信息。我知道一个选择是只添加一个时间戳,只使用最新的记录,但因为每个文件可能有100万条记录,而且我并不是每天删除100个文件(可能最多1-2个),所以看起来可能会很混乱 在数据流作业之后,理想情况下,在将文件移动到success/failure文件夹之前,我希望附加到一些“records”表中,说明此时输入了此游戏。这将是我查看发生的所有插入的方式。 我试图寻找不同的方法来实现这一点,我是cloud composer的新手,所以在10多个小时的研究之后,我不清楚这将如何工作,否则我会发布代码以供输入


    谢谢,我非常感谢大家的帮助,如果这不是你想要的那么清楚,我表示歉意。关于气流的文档非常强大,但鉴于cloud composer和bigquery相对较新,很难彻底了解如何完成某些GCP特定任务。

    听起来有点复杂。很高兴,几乎每项GCP服务都有运营商。另一件事是何时触发DAG执行。你明白了吗?您可能希望在每次新文件进入GCS存储桶时触发一个Google云函数运行

  • 触发你的DAG
  • 要触发DAG,您需要使用依赖于或触发器的Google Cloud函数调用它

  • 将数据加载到BigQuery
  • 如果您的文件已经是GCS格式的,并且是JSON或CSV格式的,那么使用数据流作业就太过分了。您可以使用将文件加载到BQ

  • 跟踪文件ID
  • 计算文件ID的最佳方法可能是使用来自Airflow的Bash或Python操作符。您能直接从文件名派生它吗

    如果是这样的话,那么您可以让位于的上游的Python操作符检查文件是否在成功的目录中

    如果是,则可以使用对BQ运行删除查询

    之后,运行GoogleCloudStorageToBigQueryOperator

  • 移动文件
  • 如果您正在将文件从地面军事系统移动到地面军事系统位置,则应执行您需要的操作。如果BQ load操作符失败,则移动到失败的文件位置,如果成功,则移动到成功的作业位置

  • 记录任务日志
  • 也许您只需要将任务信息记录到GCS就可以跟踪插入。退房


    这有帮助吗?

    所以我已经完成了云功能步骤和数据流工作(数据流是因为它有100万条记录,气流没有那么快,除非我错了)。问题是,我需要能够访问文件ID,一旦我计算它。我可以通过使用文件名并在bigquery表中进行简单的查找来计算它。在我计算之后,我需要我的模板来知道在我的查询中使用它是什么。这有意义吗?气流不会导入文件本身。它会触发文件的BQ加载作业-这是非常快速和免费的(与数据流作业不同)。-至于文件id,让我过一会儿再告诉您,您是否能够(1)将数据导入临时表-(2)等待1小时进行文件更新(3)如果文件更新,则删除临时表(4)如果文件未更新,则将临时表复制到目标表?不幸的是,没有,而且通常更新时间不会在1小时内,可以是24小时后,也可以是1个月后,甚至一年后。在这种情况下,是的-您应该有一个(1)Python操作符来计算文件ID。(2)一个BigQueryOperator,它对具有该文件ID的所有行运行删除查询。(3)。一个DataflowPythonOperator,它运行一个作业,将文件ID添加到行中,并插入t BigQuery。怎么样?