Airflow的新手。我正在尝试将结果保存到另一个存储桶中的文件(而不是一个存储桶中)。 我可以将文件保存到“ /home/airflow/gcs/data/test.json”中,然后使用gcs_hook.GoogleCloudStorageHook复制到另一个存储桶。这是代码:
def write_file_func(**context):
file = f'/home/airflow/gcs/data/test.json'
with open(file, 'w') as f:
f.write(json.dumps('{"name":"aaa", "age":"10"}'))
def upload_file_func(**context):
conn = gcs_hook.GoogleCloudStorageHook()
source_bucket = 'source_bucket'
source_object = 'data/test.json'
target_bucket = 'target_bucket'
target_object = 'test.json'
conn.copy(source_bucket, source_object, target_bucket, target_object)
conn.delete(source_bucket, source_object)
我的问题是:
我们可以直接在目标存储桶中写入文件吗?我在gcs_hook中找不到任何方法。
我尝试使用google.cloud.storage bucket.blob('test.json')。upload_from_string(),但是气流一直在说“ DAGag在服务器的DAGBag中不可用”,非常令人讨厌,我们是否不允许在DAG中使用该API?
如果我们可以直接使用google.cloud.storage/bigquery API,那么它与Airflow API有什么区别,例如gcs_hook / bigquery_hook?
谢谢
答案 0 :(得分:0)
否,您不能“直接写入目标存储桶中的文件。”要修改存储在GCS中的文件,您需要在本地下载它,进行文件更改,然后将修改后的文件上传回GCS。有关更多信息,请参阅[Google Cloud Storage] [1]和[方法] [2]。
我已经在Apache Airflow中成功编译了以下代码。随时使用它。
import pip
import logging
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.contrib.hooks.gcs_hook import GoogleCloudStorageHook
import json
from datetime import datetime
def write_file_func():
file = f'/home/airflow/gcs/data/test.json'
with open(file, 'w') as f:
f.write(json.dumps('{"name":"aaa", "age":"10"}'))
def upload_file_func():
conn = GoogleCloudStorageHook()
source_bucket = 'source_bucket'
source_object = 'data/test.json'
target_bucket = 'target_bucket'
target_object = 'test.json'
conn.copy(source_bucket, source_object, target_bucket, target_object)
#conn.delete(source_bucket, source_object)
with DAG('load_gcs_file', description='DAG', schedule_interval=None, start_date=datetime(2018, 11, 1)) as dag:
create_file = PythonOperator(task_id='create_file', python_callable=write_file_func)
copy_file = PythonOperator(task_id='copy_file', python_callable=upload_file_func)
create_file >> copy_file
注意:-)请更改source_bucket名称值以反映您的源存储桶名称。 -)请更改target_bucket名称值以反映您的目标存储桶名称。