我的选择是:
使用S3ToGoogleCloudStorageOperator ,然后使用GoogleCloudStorageToBigQueryOperator
这不是我渴望做的事情。这意味着需要支付双倍的存储费用。即使从仍然涉及付款的任一存储中删除文件。
将文件从S3
下载到本地文件系统,然后从文件系统加载到BigQuery-但是,没有S3DownloadOperator
意味着从头开始编写整个过程,而无需涉及Airflow。这错过了使用Airflow的意义。
还有其他选择吗?您建议做什么?
答案 0 :(得分:1)
您可以改用S3ToGoogleCloudStorageOperator
,然后将GoogleCloudStorageToBigQueryOperator
与external_table
表标志一起使用,即通过external_table =True
。
这将创建一个指向GCS位置的外部数据,并且不会将数据存储在BigQuery中,但是您仍然可以查询它。
答案 1 :(得分:0)
如果第一种选择是成本受限的,则可以通过PythonOperator使用S3Hook
to download the file:
from airflow.hooks.S3_hook import S3Hook
from datetime import timedelta, datetime
from airflow import DAG
from airflow.hooks.S3_hook import S3Hook
from airflow.operators.python_operator import PythonOperator
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime(2018, 1, 1),
'email_on_failure': False,
'email_on_retry': False,
'retries': 0
}
def download_from_s3(**kwargs):
hook = S3Hook(aws_conn_id='s3_conn')
hook.read_key(bucket_name='workflows-dev',
key='test_data.csv')
dag = DAG('s3_download',
schedule_interval='@daily',
default_args=default_args,
catchup=False)
with dag:
download_data = PythonOperator(
task_id='download_data',
python_callable=download_from_s3,
provide_context=True
)
答案 2 :(得分:0)
这就是我最终得到的。 应该将其转换为S3toLocalFile运算符。
def download_from_s3(**kwargs):
hook = S3Hook(aws_conn_id='project-s3')
result = hook.read_key(bucket_name='stage-project-metrics',
key='{}.csv'.format(kwargs['ds']))
if not result:
logging.info('no data found')
else:
outfile = '{}project{}.csv'.format(Variable.get("data_directory"),kwargs['ds'])
f=open(outfile,'w+')
f.write(result)
f.close()
return result