Google cloud storage mongoimport JSON从Google云存储在一个任务中

Google cloud storage mongoimport JSON从Google云存储在一个任务中,google-cloud-storage,airflow,mongoimport,Google Cloud Storage,Airflow,Mongoimport,似乎将数据从地面军事系统移动到MongoDB并不常见,因为没有太多关于这方面的文档。我们将以下任务作为python\u callable传递给python操作符-此任务将数据从BigQuery以JSON的形式移动到GCS中: def transfer_gcs_to_mongodb(table_name): # connect client = bigquery.Client() bucket_name = "our-gcs-bucket" pr

似乎将数据从地面军事系统移动到MongoDB并不常见,因为没有太多关于这方面的文档。我们将以下任务作为
python\u callable
传递给python操作符-此任务将数据从BigQuery以JSON的形式移动到GCS中:

def transfer_gcs_to_mongodb(table_name):
    # connect
    client = bigquery.Client()
    bucket_name = "our-gcs-bucket"
    project_id = "ourproject"
    dataset_id = "ourdataset"
        
    destination_uri = f'gs://{bucket_name}/{table_name}.json'
    dataset_ref = bigquery.DatasetReference(project_id, dataset_id)
    table_ref = dataset_ref.table(table_name)

    configuration = bigquery.job.ExtractJobConfig()
    configuration.destination_format = 'NEWLINE_DELIMITED_JSON'

    extract_job = client.extract_table(
        table_ref,
        destination_uri,
        job_config=configuration,
        location="US",
    )  # API request
    extract_job.result()  # Waits for job to complete.

    print("Exported {}:{}.{} to {}".format(project_id, dataset_id, table_name, destination_uri))
此任务正在成功地将数据导入地面军事系统。然而,我们现在遇到了一个难题:如何正确运行
mongoimport
,将这些数据导入MongoDB。特别是,
mongoimport
似乎无法指向GCS中的文件,但必须先在本地下载,然后导入MongoDB


在气流中应如何进行?我们是否应该编写一个shell脚本,从GCS下载JSON,然后使用正确的
uri
和所有正确的标志运行
mongoimport
?或者有没有其他方法可以在我们缺少的Airflow中运行
mongoimport

您无需编写shell脚本即可从GCS下载。您只需使用,然后就可以使用MongoHook的功能打开文件并将其写入mongo

我没有测试它,但它应该是这样的:

mongo = MongoHook(conn_id=mongo_conn_id)
with open('file.json') as f:
    file_data = json.load(f)
mongo.insert_many(file_data)
这适用于以下管道:BigQuery->GCS->Local File System->MongoDB


如果您愿意,也可以在内存中执行:BigQuery->GCS->MongoDB。

这很有意义。到目前为止,我还没有在我的气流项目中使用挂钩,但我会尝试一下。我以前使用的是
PythonOperator
pandas
,方法是将BigQuery中的数据查询到pandas数据帧中,然后
将许多
插入MongoDB,我认为它们都在内存中。我希望(a)避免内存不足问题,并(b)提高我的管道速度,这就是为什么我现在尝试在不使用pandas dataframes作为中介的情况下进行BigQuery->GCS->MongoDB。有一个
s3_to_mongo
hook,但似乎没有
GCS_to_mongo
hook,这很糟糕。我还打算使用
mongoimport
而不是python的
mongo.insert\u many
函数,希望它能提高插入mongo的速度cluster@Canovice我没有在《气流回购》中看到s3_to_mongo。也许你正在寻找某个人的自定义代码?至于你的问题:(a)避免内存问题的方法是减少内存中的内容,这意味着使用GCS->Local File System->MongoDB。我不知道你的管道,但通常ETL不仅仅是移动东西,它还涉及转换,所以如果你想在GCS或本地磁盘上转换,这是你的决定。还有
GCSFileTransformOperator
。(b) 加速ETL可以来自多个领域。您可以并行任务吗?例如,您是只复制一个文件还是多个文件?考虑动态任务。@ Canovice,这不是官方的气流回购。这是一份属于天文学家的回购协议。他们共享了一些自定义操作符来帮助社区。我认为你所描述的英语教学相对简单。“困难的部分”只是本地文件系统->MongoDB,这是您需要自己编写的东西——或者更准确地说,您只需要利用钩子功能。