2015-09-14 7 views
15

करने के लिए thisस्पार्क जेडीबीसी के साथ पुशडाउन काम की भविष्यवाणी करता है?

उत्प्रेरक मुताबिक इस तरह विधेय पुशडाउन के रूप में तार्किक अनुकूलन लागू होता है। ऑप्टिमाइज़र फ़िल्टर स्रोत को डेटा स्रोत, में अनुमानित कर सकता है, जो भौतिक निष्पादन को अप्रासंगिक डेटा छोड़ने में सक्षम बनाता है।

स्पार्क डेटा स्रोत को भविष्यवाणी करने का समर्थन करता है। क्या यह सुविधा जेडीबीसी के लिए भी उपलब्ध/अपेक्षित है?

(DB लॉग निरीक्षण से मैं देख सकता हूँ यह डिफ़ॉल्ट व्यवहार अभी नहीं है - पूरी क्वेरी डीबी को पारित कर दिया है, भले ही बाद में चिंगारी फिल्टर द्वारा सीमित है)

अधिक विवरण

PostgreSQL के साथ स्पार्क 1.5 चल रहा है 9.4

कोड स्निपेट:

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() 

एसक्यूएल ट्रेस:

< 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                             

मैं उम्मीद होती है कि पिछले चयन एक limit 1 खंड शामिल होंगे - लेकिन यह नहीं

+1

बस SQL ​​कोड में सीमा (या अन्य फ़िल्टर) जोड़ना –

उत्तर

15

स्पार्क DataFrames JDBC सूत्रों लेकिन अवधि विधेय साथ विधेय धक्का-नीचे समर्थन एक सख्त एसक्यूएल में प्रयोग किया जाता है करता है जिसका अर्थ है। इसका मतलब है कि इसमें केवल WHERE खंड शामिल है। इसके अलावा ऐसा लगता है कि यह तार्किक संयोजन तक सीमित है (IN और OR मुझे डर है) और सरल भविष्यवाणी करता है।

अन्य सभी, जैसे सीमा, गणना, आदेश, समूह और शर्तों स्पार्क पक्ष पर संसाधित की जाती है। एक चेतावनी, पहले से ही एसओ पर कवर है, df.count() या sqlContext.sql("SELECT COUNT(*) FROM df") का अनुवाद SELECT 1 FROM df में किया गया है और स्पार्क का उपयोग करके पर्याप्त डेटा स्थानांतरण और प्रसंस्करण दोनों की आवश्यकता है।

क्या इसका मतलब यह है कि यह एक खो गया कारण है? बिल्कुल नहीं। table तर्क के रूप में मनमाने ढंग से subquery का उपयोग करना संभव है। यह एक विधेय पुशडाउन से कम सुविधाजनक है लेकिन अन्यथा बहुत अच्छी तरह से काम करता है:

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) 

नोट:

यह व्यवहार, भविष्य में सुधार किया जा सकता है एक बार डेटा स्रोत API v2 को तैयार है:

संबंधित मुद्दे