将JSON数据从DocumentDB(或CosmosDB)移动到Azure Data Lake

时间:2018-05-03 07:20:39

标签: json azure azure-cosmosdb azure-data-lake

我在Cosmos DB(以前称为Document DB)中有很多JSON文件(以百万计),我想将它移动到Azure Data Lake中,用于冷藏。

我找到了这个文件https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.documents.client.documentclient.readdocumentfeedasync?view=azure-dotnet,但它没有任何样本可以开始。

我应该如何处理,我们非常感谢任何代码示例。

感谢。

4 个答案:

答案 0 :(得分:1)

是的,改变提要将起到作用。

您有两种选择。第一个(在这种情况下可能是你想要的)是通过SDK使用它。

Microsoft有一个详细的页面,介绍如何在此处添加代码示例:https://docs.microsoft.com/en-us/azure/cosmos-db/change-feed#rest-apis

第二个是更改源库,它允许您始终运行服务来监听更改并根据您的需要进行处理。有关更改Feed库的代码示例的更多详细信息,请参见:https://docs.microsoft.com/en-us/azure/cosmos-db/change-feed#change-feed-processor

(两个页面(实际上只是不同的部分)都包含指向包含代码示例的Microsoft github存储库的链接。)

请记住,就RU / s而言,您仍将被收取使用费用,但从我看来它相对较低(或者至少低于您开始阅读收藏品所支付的费用)。 )

答案 1 :(得分:1)

我建议您使用Azure Data Factory来实现您的要求。

请参阅此doc,了解如何从cosmos db和doc导出json文档,了解如何将数据导入ADL。

希望它对你有所帮助。

更新答案:

请参阅:Azure Cosmos DB as source,您可以在管道中创建query

答案 2 :(得分:1)

您还可以通过Spark阅读更改Feed。下面的python代码示例生成由loaddate为已更改的数据分区的镶木地板文件。可以按日计划在Azure Databricks笔记本中使用:

    # Get DB secrets
    endpoint = dbutils.preview.secret.get(scope = "cosmosdb", key = "endpoint")
    masterkey = dbutils.preview.secret.get(scope = "cosmosdb", key = "masterkey")

    # database & collection
    database = "<yourdatabase>"
    collection = "<yourcollection"

    # Configs
    dbConfig = {
    "Endpoint" : endpoint,
    "Masterkey" : masterkey,
    "Database" : database,
    "Collection" : collection, 
    "ReadChangeFeed" : "True",
    "ChangeFeedQueryName" : database + collection + " ",
    "ChangeFeedStartFromTheBeginning" : "False",
    "ChangeFeedUseNextToken" : "True",
    "RollingChangeFeed" : "False",
    "ChangeFeedCheckpointLocation" : "/tmp/changefeedcheckpointlocation",
    "SamplingRatio" : "1.0"
    }

    # Connect via Spark connector to create Spark DataFrame
    df = spark.read.format("com.microsoft.azure.cosmosdb.spark").options(**dbConfig).load()     

    # set partition to current date
    import datetime
    from pyspark.sql.functions import lit

    partition_day= datetime.date.today()
    partition_datetime=datetime.datetime.now().isoformat()

    # new dataframe with ingest date (=partition key)
    df_part= df.withColumn("ingest_date", lit(partition_day))

    # write parquet file
    df_part.write.partitionBy('ingest_date').mode('append').json('dir')

答案 3 :(得分:0)

您也可以使用逻辑应用程序。可以使用定时器触发器。这将是一个无代码解决方案

  1. 查询文件
  2. 循环文件
  3. 添加到Data Lake
  4. 优点是您可以在发送到Data Lake之前应用任何规则