我正在使用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") )
,但随后不再将过滤器下推。
有人可以澄清为什么会这样吗?
答案 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()