PySpark下推时间戳过滤器

时间:2018-12-06 13:49:01

标签: apache-spark

我正在使用PySpark 2.4版通过Postgres驱动程序使用jdbc读取某些表。

    df = spark.read.jdbc(url=data_base_url, table="tablename", properties=properties)

一列是时间戳列,我想像这样过滤它:

    df_new_data = df.where(df.ts > last_datetime )

这样,将过滤器作为SQL查询下推,但使用日期时间格式 是不正确的。所以我尝试了这种方法

    df_new_data = df.where(df.ts > F.date_format( F.lit(last_datetime), "y-MM-dd'T'hh:mm:ss.SSS") )

,但随后不再将过滤器下推。

有人可以澄清为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

从数据库表加载数据时,如果您想将查询下推到数据库并获得很少的结果行,则可以提供“查询”并仅将结果作为DataFrame而不是提供“表” 。这样,我们可以利用数据库引擎来处理查询,并将结果仅返回给Spark。

table参数标识要读取的JDBC表。 您可以使用SQL查询FROM子句中有效的任何内容。请注意,必须在查询中提供别名。

pushdown_query = "(select * from employees where emp_no < 10008) emp_alias"
df = spark.read.jdbc(url=jdbcUrl, table=pushdown_query, properties=connectionProperties)
df.show()