Frage Verwenden von pyspark, um eine Verbindung zu PostgreSQL herzustellen


Ich versuche, eine Verbindung mit einer Datenbank mit pyspark herzustellen und verwende den folgenden Code:

sqlctx = SQLContext(sc)
df = sqlctx.load(
    url = "jdbc:postgresql://[hostname]/[database]",
    dbtable = "(SELECT * FROM talent LIMIT 1000) as blah",
    password = "MichaelJordan",
    user =  "ScottyPippen",
    source = "jdbc",
    driver = "org.postgresql.Driver"
)

und ich erhalte den folgenden Fehler:

enter image description here

Irgendeine Idee warum passiert das?

Bearbeiten: Ich versuche, den Code lokal in meinem Computer auszuführen.


6
2018-01-22 13:51


Ursprung


Antworten:


Folgendes funktionierte für mich mit postgres auf localhost:

Laden Sie den PostgreSQL JDBC-Treiber von https://jdbc.postgresql.org/download.html.

Für die pyspark Shell verwenden Sie die SPARK_CLASSPATH Umgebungsvariable:

$ export SPARK_CLASSPATH=/path/to/downloaded/jar
$ pyspark

Zum Übermitteln eines Skripts über spark-submit benutze die --driver-class-path Flagge:

$ spark-submit --driver-class-path /path/to/downloaded/jar script.py

Laden Sie im Python - Skript die Tabellen als DataFrame wie folgt:

from pyspark.sql import DataFrameReader

url = 'postgresql://localhost:5432/dbname'
properties = {'user': 'username', 'password': 'password'}
df = DataFrameReader(sqlContext).jdbc(
    url='jdbc:%s' % url, table='tablename', properties=properties
)

oder alternativ:

df = sqlContext.read.format('jdbc').\
    options(url='jdbc:%s' % url, dbtable='tablename').\
    load()

Beachten Sie, dass beim Übermitteln des Skripts über spark-submit, müssen Sie das definieren sqlContext.


9
2018-05-05 19:41



Normalerweise benötigen Sie entweder

  1. um den Postgres-Treiber auf Ihrem Cluster zu installieren,
  2. um den Postgres-Treiber jar von Ihrem Client mit der Option --jars bereitzustellen
  3. oder um die Maven-Koordinaten des Postgres-Treibers mit --packages-Option anzugeben.

Wenn Sie angeben, wie Sie pyspark starten, können wir Ihnen weitere Details geben.

Einige Hinweise / Ideen:

spark-not-find-the-postgres-jdbc-Treiber

Keine Verbindung zu Postgres mit jdbc in der pypspark-Shell möglich


2
2018-01-22 14:47



Es ist notwendig postgresql-42.1.4.jar in allen Knoten zu kopieren ... für meinen Fall habe ich in den Pfad /opt/spark-2.2.0-bin-hadoop2.7/jars kopiert

Außerdem habe ich Classpath in ~ / .bashrc gesetzt (Export SPARK_CLASSPATH = "/ opt / spark-2.2.0-bin-hadoop2.7 / jars")

und funktionieren in pyspark Konsole und Jupiter


2
2017-11-13 16:20



Ein Ansatz, aufbauend auf dem Beispiel per Schnellstartanleitungist dieser Blogbeitrag was zeigt, wie man die --packages org.postgresql:postgresql:9.4.1211 Argument zur spark-submit Befehl.

Dies lädt den Treiber herunter into ~/.ivy2/jars Verzeichnis, in meinem Fall /Users/derekhill/.ivy2/jars/org.postgresql_postgresql-9.4.1211.jar. Übergeben Sie dies als die --driver-class-path Option gibt den vollständigen Befehl zum Senden von Funken an:

/usr/local/Cellar/apache-spark/2.0.2/bin/spark-submit\
 --packages org.postgresql:postgresql:9.4.1211\
 --driver-class-path /Users/derekhill/.ivy2/jars/org.postgresql_postgresql-9.4.1211.jar\
 --master local[4] main.py

Und in main.py:

 from pyspark.sql import SparkSession

 spark = SparkSession.builder.getOrCreate()

 dataframe = spark.read.format('jdbc').options(
         url = "jdbc:postgresql://localhost/my_db?user=derekhill&password=''",
         database='my_db',
         dbtable='my_table'
     ).load()

 dataframe.show()

1
2017-11-26 19:14



Diese Ausnahme bedeutet, dass der jdbc-Treiber nicht im Klassenpfad des Treibers enthalten ist. Sie können jdbc jars mit funken einreichen --jar Parameter, fügen Sie ihn auch in den Klassenpfad des Treibers mit ein spark.driver.extraClassPath.


0
2018-01-22 14:51