首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火花谓词下推与JDBC一起工作吗?

火花谓词下推与JDBC一起工作吗?
EN

Stack Overflow用户
提问于 2015-09-14 21:09:33
回答 1查看 16.1K关注 0票数 28

根据

催化剂应用逻辑优化,如谓词下推。优化器可以将筛选器谓词推入数据源,从而使物理执行能够跳过不相关的数据。

星火支持将谓词向下推到数据源。这个特性是否也适用于JDBC?

(通过检查DB日志,我可以看到它现在不是默认的行为-整个查询被传递给DB,即使它后来受到火花筛选器的限制)

详细信息

用PostgreSQL 9.4运行Spark1.5

代码片段:

代码语言:javascript
复制
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跟踪:

代码语言:javascript
复制
< 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, d.a
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 (a.a
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子句,但它没有

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-15 12:20:01

sources支持使用JDBC源的谓词下推,但术语谓词在严格的SQL含义中使用。这意味着它只包括WHERE子句。此外,它似乎仅限于逻辑连接(恐怕没有INOR )和简单谓词。

其他一切,如限制、计数、排序、组和条件,都是在火花边处理的。其中一个警告是,df.count()sqlContext.sql("SELECT COUNT(*) FROM df")已被转换为SELECT 1 FROM df,并且需要大量的数据传输和使用Spark进行处理。

这是否意味着这是一个失败的事业?不完全同意。可以使用任意子查询作为table参数。它不像谓词下推那么方便,但在其他方面工作得很好:

代码语言:javascript
复制
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)

Note

一旦数据源API v2准备就绪,这种行为在将来可能会得到改进:

票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32573991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档