Tut spark-predicate-pushdown-Arbeit mit JDBC?
Laut diese
Katalysator gilt logische Optimierungen wie predicate-pushdown. Die
optimizer push-filter-Prädikate unten in der Datenquelle,
ermöglicht die Ausführung überspringen irrelevanter Daten.
Spark unterstützt push-down von Prädikaten, um die Datenquelle.
Ist diese Funktion auch verfügbar ist /erwartet für JDBC?
(Von der überprüfung der DB-logs kann ich sehen, dass es nicht das Standardverhalten gerade jetzt - die vollständige Abfrage wird an die DB, auch wenn es später beschränkt durch die spark-Filter)
MEHR DETAILS
Läuft Spark 1.5 mit PostgreSQL 9.4
code-snippet:
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-Trace:
< 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
Ich würde erwarten, dass die Letzte auswählen wird eine limit 1
- Klausel - muss es aber nicht
- Nur das hinzufügen der Grenze (oder einem anderen Filter ) in den SQL-code selbst
Du musst angemeldet sein, um einen Kommentar abzugeben.
Funke DataFrames Unterstützung Prädikat push-down mit JDBC-Quellen, aber der Begriff Prädikat verwendet wird, in eine strikte SQL-Bedeutung. Es bedeutet, dass es deckt nur
WHERE
- Klausel. Außerdem sieht es aus wie es ist beschränkt auf das logische Verbindung (keineIN
undOR
fürchte ich) und einfache Prädikate.Alles andere, wie limits, zählen, bestellen, Gruppen und Bedingungen werden auf der Funke-Seite. Eine Einschränkung, die bereits Gegenstand SO, dass
df.count()
odersqlContext.sql("SELECT COUNT(*) FROM df")
übersetztSELECT 1 FROM df
und erfordert sowohl erhebliche Datenübertragung und-Verarbeitung mit Spark.Heißt es, es ist eine verlorene Sache? Nicht genau. Es ist möglich, eine beliebige Unterabfrage als
table
argument. Es ist weniger bequem als eine predicate-pushdown, aber ansonsten funktioniert ziemlich gut:Hinweis:
Dieses Verhalten kann verbessert werden, in der Zukunft, wenn die Daten einmal-Source-API-v2 ist fertig: