Apache spark Spark数据帧过滤提供不一致的输出

Apache spark Spark数据帧过滤提供不一致的输出,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个包含26000条记录的MongoDB集合,我正在将这些记录读入一个数据帧。它有一个列,column_1,在所有记录中都有字符串值column_1_值。我正在尝试过滤数据帧并获得如下计数 val readConfig = ReadConfig(Map("collection" -> collectionName,"spark.mongodb.input.readPreference.name" -> "primaryPreferred", "spark.mongodb.inpu

我有一个包含26000条记录的MongoDB集合,我正在将这些记录读入一个数据帧。它有一个列,
column_1
,在所有记录中都有字符串值
column_1_值
。我正在尝试过滤数据帧并获得如下计数

val readConfig = ReadConfig(Map("collection" -> collectionName,"spark.mongodb.input.readPreference.name" -> "primaryPreferred", "spark.mongodb.input.database" -> dataBaseName, "spark.mongodb.input.uri" -> hostName))
val dataFrame = MongoSpark.load(spark, readConfig)
df.filter(df.col("column_1") === "column_1_value").count()
其中
spark
SparkSession
的实例

MongoDB记录结构如下所示

{
    "_id" : ObjectId("SOME_ID"),
    "column_1" : "column_1_value",
    "column_2" : SOME_VALUE,
    "column_3" : SOME_OTHER_VALUE
}
没有嵌套结构,所有记录都具有相同的字段集。Spark运行期间,我不会访问数据库

由于所有记录都具有相同的
column_1
,因此我希望将数据帧大小本身作为输出,但我得到的是一个较低的值。不仅如此,我每次运行上述程序都会得到不同的结果。结果通常在15000到24000之间变化

但同样的方法似乎适用于收集规模较小(约5000个)的情况

我尝试过以下方法,但没有成功

  • 使用
    equalTo
    代替
    =
  • 已使用
    $column\u 1
  • 使用的
    isin
  • 使用
    df.where
    代替
    df.filter
  • 使用
    createOrReplaceTempView
    并运行SQL查询
唯一有效的方法是
df.cache()
df.persist()
,我认为这两种方法在处理大数据时对整体性能都没有好处

这种行为的可能原因是什么?解决的方法是什么

我的Spark版本是2.2.0,MongoDB版本是3.4。我在本地模式下运行Spark,有16GB的RAM和8核处理器

编辑1 尝试如下更改Mongo Spark连接器分区策略,但未成功

val readConfig = ReadConfig(Map("collection" -> collectionName,"spark.mongodb.input.readPreference.name" -> "primaryPreferred", "spark.mongodb.input.database" -> dataBaseName, "spark.mongodb.input.uri" -> hostName, "spark.mongodb.input.partitionerOptions" -> "MongoPaginateBySizePartitioner"))
val dataFrame = MongoSpark.load(spark, readConfig)
df.count()
df.filter(df.col("column_1") === "column_1_value").count()

第一个计数返回正确的值,即使使用默认的分区策略,这使我相信Mongo连接器工作正常。

请尝试将其推向可复制的问题。现在它是不负责任的。如何加载数据?来源是什么?源代码是否处于活动状态(在运行Spark代码时进行了修改)?
column_1
是如何派生的?等等…@user8371915根据您的建议编辑可能重复的@user8371915尝试了您的解决方案,但无效。编辑了问题的细节