是否可以在s3(csv文件)之间创建worflow(气流)以将其存储在mongodb中?

时间:2018-12-19 12:00:35

标签: python amazon-web-services amazon-s3 airflow

我想创建一个工作流以从s3中获取文件并将数据存储到mongodb中,到目前为止,我采用了这种方法:

dag = DAG('s3_to_mongo',
        schedule_interval='@daily',
        catchup=False)


first_task = DummyOperator(task_id='dummy_task', dag=dag)

s3_mongo_task = S3ToMongoOperator(s3_conn_id='', s3_bucket='', s3_key='',
                                mongo_conn_id='', mongo_collection='', mongo_method='insert',
                                mongo_db=None, mongo_replacement_filter=None, upsert=False, dag=dag)

first_task >> s3_mongo_task

我正在使用运算符获取官方文档:https://github.com/airflow-plugins/mongo_plugin/blob/master/operators/s3_to_mongo_operator.py

1 个答案:

答案 0 :(得分:0)

Airflow和Mongo插件不支持S3上的CSV文件。 您需要编写自己的运算符。

class S3CsvToMongoOperator(S3ToMongoOperator):
    def __init__(*args, **kwargs):
        super().__init__(*args, **kwargs)

    def execute(self, context):
        s3 = S3Hook(self.s3_conn_id)
        mongo = MongoHook(conn_id=self.mongo_conn_id)

        data = (s3
                .get_key(self.s3_key,
                         bucket_name=self.s3_bucket)
                .get_contents_as_string(encoding='utf-8'))

        lines = data.split('\n')
        docs = [doc for doc in csv.DictReader(lines)]

        self.method_mapper(mongo, docs)