如何使用Airflow执行S3到BigQuery?

如何使用Airflow执行S3到BigQuery?,airflow,Airflow,目前没有 我的选择是: 使用,然后使用GoogleCloudStorageToBigQueryOperator 这不是我渴望做的事情。这意味着为存储支付双倍的费用。即使从任何一个仍涉及付款的存储中删除文件 将文件从S3下载到本地文件系统,并从文件系统加载到BigQuery-但是没有S3DownloadOperator,这意味着从头开始编写整个过程,不需要任何人参与。这忽略了使用气流的意义 还有别的选择吗?您建议怎么做?如果第一个选项是成本限制,您可以通过PythonOperator使用S3H

目前没有

我的选择是:

  • 使用,然后使用
    GoogleCloudStorageToBigQueryOperator

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

  • 将文件从
    S3
    下载到本地文件系统,并从文件系统加载到BigQuery-但是没有
    S3DownloadOperator
    ,这意味着从头开始编写整个过程,不需要任何人参与。这忽略了使用气流的意义


  • 还有别的选择吗?您建议怎么做?

    如果第一个选项是成本限制,您可以通过PythonOperator使用
    S3Hook

    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
        )
    

    您可以改为使用
    s3togologlecloudstorageoperator
    ,然后使用
    GoogleCloudStorageToBigQueryOperator
    external_table
    表标志,即pass
    external_table=True


    这将创建一个指向地面军事系统位置的外部数据,它不会将您的数据存储在BigQuery中,但您仍然可以查询它。

    这就是我最终得到的结果。 应将其转换为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
    

    在哪里指定保存文件的位置?这个钩子可以支持下载包含多个文件的文件夹吗?然后我如何将文件加载到BigQuery我没有看到从文件系统加载文件?这是一个很好的破解,可以完全用于其他人,但我需要在不使用外部表的情况下解决它。我需要数据实际保存在BigQuery上。我需要使用分区等…为什么你认为该文件是csv?在我的情况下,我只想读取给定ds的csv文件。因此,密钥(s3文件名)最终将类似于2018-09-18.csv。对于其他用例,只需更改键值的构造方式,以匹配要在S3存储桶中拾取的文件。