Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何使用Pyspark从mongodb中仅提取特定行?_Apache Spark_Pyspark_Apache Spark Sql_Spark Streaming - Fatal编程技术网

Apache spark 如何使用Pyspark从mongodb中仅提取特定行?

Apache spark 如何使用Pyspark从mongodb中仅提取特定行?,apache-spark,pyspark,apache-spark-sql,spark-streaming,Apache Spark,Pyspark,Apache Spark Sql,Spark Streaming,我正在从mongodb集合中提取数据,并使用Spark python代码将其写入bigquery表 下面是我的代码片段: df = spark.read\ .format("com.mongodb.spark.sql.DefaultSource")\ .option("uri","mongodb_url")\ .option("database","db_name")\

我正在从mongodb集合中提取数据,并使用Spark python代码将其写入bigquery表

下面是我的代码片段:

df = spark.read\
    .format("com.mongodb.spark.sql.DefaultSource")\
    .option("uri","mongodb_url")\
    .option("database","db_name")\
    .option("collection", "collection_name")\
    .load()

df.write \
  .format("bigquery") \
  .mode("append")\
  .option("temporaryGcsBucket","gcs_bucket") \
  .option("createDisposition","CREATE_IF_NEEDED")\
  .save("bq_dataset_name.collection_name")
这将从mongodb集合中提取所有数据。但是我只想提取满足条件的文档(比如sql查询中的where条件)

我发现的一种方法是读取数据帧中的全部数据,并在该数据帧上使用过滤器,如下所示:

df2 = df.filter(df['date'] < '12-03-2020 10:12:40')
df2=df.filter(df['date']<'12-03-2020 10:12:40')
但由于我的源mongo集合有8-10GB的数据,我无法每次都从mongo读取全部数据


使用spark.read从mongo读取数据时,如何使用筛选?

即使在应用筛选后,您是否已尝试检查是否扫描了整个数据

假设您使用的是with spark,则支持过滤器/谓词下推

“谓词下推”是从连接器和 Catalyst optimizer自动将谓词“下推”到数据 节点。我们的目标是最大限度地利用网络过滤掉的数据量 数据存储端,然后将其加载到Spark的节点内存中

MongoDB的连接器会自动向下推送两种谓词:

  • 选择
    子句(投影)作为
    $project
  • 过滤器
    子句内容(
    其中
    )作为一个或多个
    $match
您可以找到这方面的支持代码

注: 关于嵌套字段上的谓词下推存在一些问题,但这是spark本身的一个缺陷,也会影响其他源。这已在Spark 3.x中修复。检查答案