Apache spark Spark数据帧过滤提供不一致的输出
我有一个包含26000条记录的MongoDB集合,我正在将这些记录读入一个数据帧。它有一个列,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
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
- 使用
并运行SQL查询createOrReplaceTempView
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尝试了您的解决方案,但无效。编辑了问题的细节