使用foreachPartition管理多个数据库连接和数据

时间:2020-02-03 14:29:41

标签: apache-spark apache-spark-sql

将尝试使它尽可能清晰,因此不需要示例,因为这必须是我无法正确理解的概念,我正在努力而不是因为数据或Spark代码本身存在问题。

我需要在他们自己的数据库( MongoDB )中插入城市数据,并且我试图尽快执行这些更新。

考虑以下示例数据帧,我想根据例如城市对MongoDB进行一些更新 strong>和区域

year - city - zone - num_business - num_vehicles

具有 groupedBy 这些列,我正要在数据库中执行更新操作。

使用MongoDB驱动程序时,我需要实例化几个WriteConfig来处理多个数据库(每个城市 1个数据库)。

    // the 'getDatabaseWriteConfigsPerCity' method filters the 'df' so it only contains the docs from a single city.
    for (cityDBConnection <- getDatabaseWriteConfigsPerCity(df) {
        cityDBConnection.getDf.foreach(
            ... // set MongoDB upsert criteria.
        )
    }

以这种方式行之有效,但是使用foreachPartition仍然可以获得更高的性能,因为我希望DF中的那些记录可以传播给执行者,同时更多的数据也需要更新。

但是,使用foreachPartition时我得到了错误的结果。错误,因为它们似乎不完整。计数器距离如此之遥。

我怀疑这是因为,在分区中,相同的密钥位于不同的分区中,直到将它们作为单个记录插入到MongoDB中时,才将它们合并到主数据库中。

有什么办法可以确保分区包含与upsert密钥相关的文档的总计

不是很清楚我是否足够清楚,但是如果它仍然太复杂,我会尽快进行更新。

1 个答案:

答案 0 :(得分:2)

有什么办法可以确保分区包含总计 与更新密钥相关的文件?如果这样做:

df.repartition("city").foreachPartition{...}

您可以确保所有具有相同city的记录都在同一个分区中(但是每个分区可能有1个以上的city!)