복붙노트

[PYTHON] JDBC로 술어 푸시 다운 작업을 유발합니까?

PYTHON

JDBC로 술어 푸시 다운 작업을 유발합니까?

이것에 따르면

Spark는 데이터 원본에 대한 술어의 푸시 다운을 지원합니다. 이 기능을 JDBC에서도 사용할 수 있습니까?

(DB 로그를 검사하여 지금은 기본 동작이 아니라는 것을 알 수 있습니다. 나중에 전체 필터가 스파크 필터로 제한 되더라도 전체 쿼리가 DB로 전달됩니다)

자세한 내용은

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, 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                                                                                                                   

마지막 선택에는 제한 1 절이 포함될 것으로 예상되지만,

해결법

  1. ==============================

    1.Spark DataFrames는 JDBC 소스로 술어 푸시 다운을 지원하지만 용어 술어는 엄격한 SQL 의미에서 사용됩니다. 그것은 WHERE 절만을 포함한다는 것을 의미합니다. 또한 논리 결합 (IN과 OR이 없으며 두려운 것)과 간단한 술어에 국한된 것처럼 보입니다.

    Spark DataFrames는 JDBC 소스로 술어 푸시 다운을 지원하지만 용어 술어는 엄격한 SQL 의미에서 사용됩니다. 그것은 WHERE 절만을 포함한다는 것을 의미합니다. 또한 논리 결합 (IN과 OR이 없으며 두려운 것)과 간단한 술어에 국한된 것처럼 보입니다.

    한계, 수, 순서, 그룹 및 조건과 같은 모든 것은 스파크 측면에서 처리됩니다. 이미 SO에서 다루고있는 한 가지 경고는 df.count () 또는 sqlContext.sql ( "SELECT COUNT (*) FROM df")이 SELECT 1 FROM df로 변환되고 Spark를 사용하여 실질적인 데이터 전송과 처리가 필요하다는 것입니다.

    잃어버린 원인이라는 뜻입니까? 정확히. 임의의 하위 쿼리를 테이블 인수로 사용할 수 있습니다. 술어 푸시 다운보다 덜 편리하지만 그렇지 않으면 꽤 잘 작동합니다.

    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가 준비되면 나중에이 동작이 향상 될 수 있습니다.

  2. from https://stackoverflow.com/questions/32573991/does-spark-predicate-pushdown-work-with-jdbc by cc-by-sa and MIT license