PySpark和MongoDB连接器:无法查询管道内的日期

PySpark和MongoDB连接器:无法查询管道内的日期,mongodb,datetime,pyspark,aggregation-framework,Mongodb,Datetime,Pyspark,Aggregation Framework,我正在运行PySpark,我已经设置了一个MongoDB连接器来访问我的数据库。我正在尝试构建一个管道,其中$match阶段包括对日期的过滤。我不能使这项工作,我可能需要一些像ISODATE(“”)在这里 我已经尝试了使用正确格式的datetime对象,还尝试在$match阶段传递isoformat字符串。这些都不起作用 mongoURI = "mongodb://localhost/databaseName.collection" my_spark = SparkSession.builder

我正在运行PySpark,我已经设置了一个MongoDB连接器来访问我的数据库。我正在尝试构建一个管道,其中$match阶段包括对日期的过滤。我不能使这项工作,我可能需要一些像ISODATE(“”)在这里

我已经尝试了使用正确格式的datetime对象,还尝试在$match阶段传递isoformat字符串。这些都不起作用

mongoURI = "mongodb://localhost/databaseName.collection"
my_spark = SparkSession.builder.master("local").appName("test").config("spark.mongodb.input.uri", mongoURI).getOrCreate()
from_date = datetime.datetime(2018, 1, 1)
to_date = datetime.datetime(2018, 1, 1)
products =['P1', 'P2']
clients = ['C1', 'C2']
pipeline = [
 {'$match': {'$and': [ { '_created_at': { '$gt': from_date } }, { '_created_at': { '$lt': to_date } } ],'product': {'$in': products},'client': {'$in':clients }}},
 {'$project': {'product': 1,'client': 1}}]
df = my_spark.read.format("com.mongodb.spark.sql.DefaultSource").option("pipeline", pipeline).load()
print(df.printSchema())
我希望能取回一些文档,但我得到了这个错误

 Py4JJavaError: An error occurred while calling o36.load.: java.lang.IllegalArgumentException: requirement failed: Invalid Aggregation map Map ... 
 It should be a list of pipeline stages (Documents) or a single pipeline stage (Document)

如果我将日期作为字符串传递,我将得到一个None模式,当我排除查询中基于日期的部分时,我将返回文档。因此,问题就出在这一部分。

问题在于您的案例中的日期是from_date和to_date,因为您将它们以变量的形式传递给管道,PySpark不采用您为ISO日期定义的格式。这就是它失败的原因,但错误并不是那么显而易见的

以下是将日期转换为ISO日期,然后传递到管道的修复方法:

 from_date = datetime.datetime(2018, 1, 1)
 print(type(from_date ))
 >> <type 'datetime.datetime'>
 from_date = from_date.isoformat()
 from_date = from_date+"Z"
 print(from_date)
 >> 2018-01-01T00:00:00Z

我找到了解决办法。事实上,这很简单。我只需将日期定义如下:from_date=str(datetime.datetime(2018,1,1).isoformat())+“Z”,然后在管道内{{{u created_at':{$gt':{$date':from_date}
pipeline = [{'$match': {'$and': [ { '_created_at': { '$gt': from_date } }, { '_created_at': { '$lt': to_date } } ],'product': {'$in': products},'client': {'$in':clients }}},{'$project': {'product': 1,'client': 1}}]