Apache spark 火花时间戳上的过滤器不';我不能在超过一天的范围内工作

Apache spark 火花时间戳上的过滤器不';我不能在超过一天的范围内工作,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我正在使用pyspark 2.3.0版本。 我在时间戳列上过滤数据帧 |--requestTs:timestamp(nullable=true) 当我在日间时间范围内进行过滤时,效果非常好。 当我在2天范围内跨越过滤器时,它不会返回所有记录。 我尝试了以下几种方法: df1 = df.filter(df["requestts"] >= sqlf.lit(startDatestr)) \ .filter(df["requestts"] <= sql

我正在使用pyspark 2.3.0版本。 我在时间戳列上过滤数据帧

|--requestTs:timestamp(nullable=true)

当我在日间时间范围内进行过滤时,效果非常好。 当我在2天范围内跨越过滤器时,它不会返回所有记录。 我尝试了以下几种方法:

        df1 = df.filter(df["requestts"] >= sqlf.lit(startDatestr)) \
           .filter(df["requestts"] <= sqlf.lit(endDatestr))
在哪里

当我计算返回的记录时,我得到

after date filter, count is :1168940768
如果我扩展搜索(因此我希望记录的数量更大或相等),如:

我得到的记录要少得多

我很困惑这是什么原因,什么是按时间戳过滤的最佳方式。
还有我是如何考虑时区的。

您的查询应该可以工作。我刚在Pypark的外壳上试过

>>> from datetime import datetime
>>> import pyspark.sql.functions as F

>>> columns = ['id', 'ts']
>>> vals = [
...     (1, datetime(2018, 6, 26)),
...     (2, datetime(2018, 6, 27)),
...     (3, datetime(2018, 6, 28)),
...     (4, datetime(2018, 6, 29)),
...     (5, datetime(2018, 6, 30))
... ]
>>> df = spark.createDataFrame(vals, columns)

>>> df.show()
+---+-------------------+
| id|                 ts|
+---+-------------------+
|  1|2018-06-26 00:00:00|
|  2|2018-06-27 00:00:00|
|  3|2018-06-28 00:00:00|
|  4|2018-06-29 00:00:00|
|  5|2018-06-30 00:00:00|
+---+-------------------+

>>> df.printSchema()
root
 |-- id: long (nullable = true)
 |-- ts: timestamp (nullable = true)
这里有一个类似于您的查询:

>>> df.filter(df['ts'] >= F.lit('2018-06-27 00:00:00')) \
...     .filter(df['ts'] < F.lit('2018-06-29 00:00:00')).show()
+---+-------------------+
| id|                 ts|
+---+-------------------+
|  2|2018-06-27 00:00:00|
|  3|2018-06-28 00:00:00|
+---+-------------------+
对于时区,您可以查看的pyspark文档。 为了便于参考,我还粘贴了下面的示例:

>>> spark.conf.set("spark.sql.session.timeZone", "America/Los_Angeles")
>>> time_df = spark.createDataFrame([(1428476400,)], ['unix_time'])
>>> time_df.select(from_unixtime('unix_time').alias('ts')).collect()
[Row(ts='2015-04-08 00:00:00')]
>>> spark.conf.unset("spark.sql.session.timeZone")

谢谢你的回答,是的,我做了一个测试,就像你描述的那样,我看到我的代码应该可以工作,这就是为什么我不理解为什么它不能工作,我想可能是因为时区,或者与时间段、演员等有关的原因。最后一个没有lit函数的示例是我最初的尝试,spark所做的是将过滤器插入为:扫描后过滤器:isnotnull(requestts#409),(cast(requestts#409作为字符串)>=2018-06-26 07:00:00),(cast(requestts#409作为字符串)我认为铸造应该是良好的和良好的测试。你为什么不创建一个小例子,像我一样,并附加你的代码在你原来的职位?我的例子工作,所以不需要写在这里,想知道什么改变了从例子到大规模测试
>>> from datetime import datetime
>>> import pyspark.sql.functions as F

>>> columns = ['id', 'ts']
>>> vals = [
...     (1, datetime(2018, 6, 26)),
...     (2, datetime(2018, 6, 27)),
...     (3, datetime(2018, 6, 28)),
...     (4, datetime(2018, 6, 29)),
...     (5, datetime(2018, 6, 30))
... ]
>>> df = spark.createDataFrame(vals, columns)

>>> df.show()
+---+-------------------+
| id|                 ts|
+---+-------------------+
|  1|2018-06-26 00:00:00|
|  2|2018-06-27 00:00:00|
|  3|2018-06-28 00:00:00|
|  4|2018-06-29 00:00:00|
|  5|2018-06-30 00:00:00|
+---+-------------------+

>>> df.printSchema()
root
 |-- id: long (nullable = true)
 |-- ts: timestamp (nullable = true)
>>> df.filter(df['ts'] >= F.lit('2018-06-27 00:00:00')) \
...     .filter(df['ts'] < F.lit('2018-06-29 00:00:00')).show()
+---+-------------------+
| id|                 ts|
+---+-------------------+
|  2|2018-06-27 00:00:00|
|  3|2018-06-28 00:00:00|
+---+-------------------+
>>> df.filter((df['ts'] >= F.lit('2018-06-27 00:00:00'))
...           & (df['ts'] < F.lit('2018-06-29 00:00:00'))).show()
+---+-------------------+
| id|                 ts|
+---+-------------------+
|  2|2018-06-27 00:00:00|
|  3|2018-06-28 00:00:00|
+---+-------------------+
>>> df.filter((df['ts'] >= '2018-06-27 00:00:00')
...           & (df['ts'] < '2018-06-29 00:00:00')).show()
+---+-------------------+
| id|                 ts|
+---+-------------------+
|  2|2018-06-27 00:00:00|
|  3|2018-06-28 00:00:00|
+---+-------------------+
>>> spark.conf.set("spark.sql.session.timeZone", "America/Los_Angeles")
>>> time_df = spark.createDataFrame([(1428476400,)], ['unix_time'])
>>> time_df.select(from_unixtime('unix_time').alias('ts')).collect()
[Row(ts='2015-04-08 00:00:00')]
>>> spark.conf.unset("spark.sql.session.timeZone")