如何使用Airflow对BigQuery执行S3?

时间:2018-09-03 12:29:57

标签: airflow

当前没有S3ToBigQuery operator

我的选择是:

  1. 使用S3ToGoogleCloudStorageOperator ,然后使用GoogleCloudStorageToBigQueryOperator

    这不是我渴望做的事情。这意味着需要支付双倍的存储费用。即使从仍然涉及付款的任一存储中删除文件。

  2. 将文件从S3下载到本地文件系统,然后从文件系统加载到BigQuery-但是,没有S3DownloadOperator意味着从头开始编写整个过程,而无需涉及Airflow。这错过了使用Airflow的意义。

还有其他选择吗?您建议做什么?

3 个答案:

答案 0 :(得分:1)

您可以改用S3ToGoogleCloudStorageOperator,然后将GoogleCloudStorageToBigQueryOperatorexternal_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