是否启动谓词下推使用JDBC?
据此
Catalyst使用逻辑优化(如谓词下推)。 优化器可以将筛选谓词向下推送到数据源中,使物理执行跳过不相关的数据。
Spark支持将谓词按下到数据源。 此function是否也可用于JDBC?
(从检查数据库日志,我可以看到它不是现在的默认行为 – 完整的查询被传递给数据库,即使它后来被火花filter限制)
更多细节
使用PostgreSQL 9.4运行Spark 1.5
代码片段:
from pyspark import SQLContext, SparkContext, Row, SparkConf from data_access.data_access_db import REMOTE_CONNECTION sc = SparkContext() sqlContext = SQLContext(sc) url = 'jdbc:postgresql://{host}/{database}?user={user}&password={password}'.format(**REMOTE_CONNECTION) sql = "dummy" df = sqlContext.read.jdbc(url=url, table=sql) df = df.limit(1) df.show()
SQL跟踪:
< 2015-09-15 07:11:37.718 EDT >LOG: execute <unnamed>: SET extra_float_digits = 3 < 2015-09-15 07:11:37.771 EDT >LOG: execute <unnamed>: SELECT * FROM dummy WHERE 1=0 < 2015-09-15 07:11:37.830 EDT >LOG: execute <unnamed>: SELECT c.oid, a.attnum, a.attname, c.relname, n.nspname, a.attnotnull OR (t.typtype = 'd' AND t.typnotnull), pg_catalog.pg_get_expr(d.adbin, da drelid) LIKE '%nextval(%' FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid) JOIN pg_catalog.pg_attribute a ON (c.oid = a.attrelid) JOIN pg_catalog.pg_type t ON (aa tttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef d ON (d.adrelid = a.attrelid AND d.adnum = a.attnum) JOIN (SELECT 15218474 AS oid , 1 AS attnum UNION ALL SELECT 15218474, 3) vals ON (c.oid = vals.oid AND a.attnum = vals.attnum) < 2015-09-15 07:11:40.936 EDT >LOG: execute <unnamed>: SET extra_float_digits = 3 < 2015-09-15 07:11:40.964 EDT >LOG: execute <unnamed>: SELECT "id","name" FROM dummy
我希望最后的select将包括一个limit 1
条款 – 但事实并非如此
Spark DataFrames支持使用JDBC源进行谓词下推,但术语谓词是以严格的SQL含义使用的。 这意味着它只包含WHERE
子句。 此外,它看起来像它是有限的逻辑连词(没有IN
和OR
恐怕)和简单的谓词。
其他的一切,如限制,计数,sorting,组和条件在Spark端处理。 已经覆盖在SO上的一个警告是,将df.count()
或sqlContext.sql("SELECT COUNT(*) FROM df")
转换为SELECT 1 FROM df
并且需要使用Spark进行大量的数据传输和处理。
这是否意味着失败的原因? 不完全是。 可以使用任意子查询作为table
参数。 它比谓词下推不太方便,但其他方面工作得很好:
n = ... # Number of rows to take sql = "(SELECT * FROM dummy LIMIT {0}) AS tmp".format(int(n)) df = sqlContext.read.jdbc(url=url, table=sql)
注意 :
Data Source API v2准备就绪后,此行为可能会得到改进:
- SPARK-15689
- SPIP:数据源API V2