将尝试使它尽可能清晰,因此不需要示例,因为这必须是我无法正确理解的概念,我正在努力而不是因为数据或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密钥相关的文档的总计?
不是很清楚我是否足够清楚,但是如果它仍然太复杂,我会尽快进行更新。
答案 0 :(得分:2)
有什么办法可以确保分区包含总计 与更新密钥相关的文件?如果这样做:
df.repartition("city").foreachPartition{...}
您可以确保所有具有相同city
的记录都在同一个分区中(但是每个分区可能有1个以上的city
!)