配置自定义分区以对分析存储数据进行分区

适用对象: NoSQL MongoDB Gremlin

通过自定义分区,你可以在分析查询中对通常用作筛选器的字段上的分析存储数据进行分区,从而提高查询性能。 若要详细了解自定义分区,请参阅什么是自定义分区一文。

若要使用自定义分区,必须在 Azure Cosmos DB 帐户上启用 Azure Synapse Link。 若要了解详细信息,请参阅如何配置 Azure Synapse Link。 可以使用 Azure Synapse Link for Azure Cosmos DB 从 Azure Synapse Spark 笔记本触发自定义分区执行。

注意

Azure Cosmos DB 帐户应启用 Azure Synapse Link,以利用自定义分区。 自定义分区目前仅支持 Azure Synapse Spark 2.0。

注意

Synapse Link for Gremlin API 现为预览版。 可以使用 Azure CLI 在新图形或现有图形中启用 Synapse Link。 有关如何配置它的详细信息,请单击此处

触发自定义分区作业

可以使用 Azure Synapse Link 触发 Azure Synapse Spark 笔记本中的分区。 你可以对其进行计划,将其为作为后台作业运行,一天运行一次或两次,还可以根据需要增加执行频率。 还可以从数据集中选择一个或多个字段作为分析存储分区键。

以下是触发自定义分区执行的必需配置选项:

  • spark.cosmos.asns.execute.partitioning - 触发自定义分区执行的布尔值。 默认值为 false。

  • spark.cosmos.asns.partition.keys - 使用 DDL 格式字符串的分区键。 例如:ReadDate 字符串。

  • spark.cosmos.asns.basePath - Synapse 主存储帐户上分区存储的基路径。

注意

如果选择多个分区键,则可以使用指示键的 basePath 从同一分区存储访问这些记录。

以下是在触发自定义分区执行时可以使用的可选配置选项:

  • spark.cosmos.asns.merge.partitioned.files - 用于每次执行时为每个分区值创建一个文件的布尔值。 默认值为 false。

  • spark.cosmos.asns.partitioning.maxRecordsPerFile - 分区存储中单个分区文件中的最大记录数。 如果指定了此配置和 spark.cosmos.asns.merge.partitioned.files,则一旦记录数超过 maxRecordsPerFile 值,就会创建新文件。 此配置通常仅用于较大集合的初始分区。 默认值为 1,000,000。

    设置 maxRecordsPerFile 但未配置 spark.cosmos.asns.merge.partitioned.files 时,记录可能会在达到 maxRecordsPerFile 之前跨文件拆分。 文件拆分还取决于池上的可用并行度。

  • spark.cosmos.asns.partitioning.shuffle.partitions - 它在分区写入分区存储期间控制并行度。 此配置仅用于较大集合的初始分区。 设置为 Spark 池上的可用核心数。 默认值为 200。 如果池不用于其他工作负荷,则值较低可能会浪费资源。 较高的值通常不会导致问题,因为某些任务会提前完成,并且可以在执行速度慢的任务时启动更多任务。 如果希望更快地完成分区作业,增加池大小是一种很好的做法。

spark.read\
    .format("cosmos.olap") \
    .option("spark.synapse.linkedService", "<enter linked service name>") \
    .option("spark.cosmos.container", "<enter container name>") \
    .option("spark.cosmos.asns.execute.partitioning", "true") \
    .option("spark.cosmos.asns.partition.keys", "readDate String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    .option("spark.cosmos.asns.merge.partitioned.files", "true") \
    .option("spark.cosmos.asns.partitioning.maxRecordsPerFile", "2000000") \
    .option("spark.cosmos.asns.partitioning.shuffle.partitions", "400") \
    .load()

使用分区存储执行查询

使用分区存储支持执行查询需要以下两个配置:

  • spark.cosmos.asns.partition.keys
  • spark.cosmos.asns.basePath

下面的示例演示如何使用这些配置来查询上述分区存储,以及如何使用分区键进行筛选以利用分区删除。 此分区存储使用“ReadDate”字段进行分区。

df = spark.read\
    .format("cosmos.olap") \
    .option("spark.synapse.linkedService", "<enter linked service name>") \
    .option("spark.cosmos.container", "<enter container name>") \
    .option("spark.cosmos.asns.partition.keys", "readDate String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    .load()

df_filtered = df.filter("readDate='2020-11-01 00:00:00.000'")
display(df_filtered.limit(10))

上述 ReadDate = '2021-11-01' 筛选器将在执行过程中从扫描中消除与除 2021-11-01 之外的 ReadDate 值对应的数据 。

注意

使用分区存储的查询改进适用于以下查询:

  • 从 Azure Cosmos DB 分析存储容器创建的 Spark 数据帧,以及
  • 指向 Azure Cosmos DB 分析存储容器的 Spark 表。

后续步骤

若要了解更多信息,请参阅下列文档: