web-dev-qa-db-fra.com

Utiliser pyspark pour se connecter à PostgreSQL

J'essaie de me connecter à une base de données avec pyspark et j'utilise le code suivant:

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

et j'obtiens l'erreur suivante:

enter image description here

Une idée pourquoi cela se produit-il?

Edit : J'essaie d'exécuter le code localement sur mon ordinateur.

11
Mpizos Dimitris

Ce qui suit a fonctionné pour moi avec postgres sur localhost:

Téléchargez le pilote JDBC PostgreSQL depuis https://jdbc.postgresql.org/download.html .

Pour le pyspark Shell, vous utilisez le SPARK_CLASSPATH variable d'environnement:

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

Pour soumettre un script via spark-submit Utilisez le --driver-class-path drapeau:

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

Dans le script python chargez les tables en tant que DataFrame comme suit:

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
)

ou bien:

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

Notez que lors de la soumission du script via spark-submit, vous devez définir le sqlContext.

12
mdh

C'est une copie nécessaire postgresql-42.1.4.jar dans tous les nœuds ... pour mon cas, j'ai copié dans le chemin /opt/spark-2.2.0-bin-hadoop2.7/jars

De plus, j'ai défini le chemin de classe dans ~/.bashrc (export SPARK_CLASSPATH = "/ opt/spark-2.2.0-bin-hadoop2.7/jars")

et fonctionne bien dans la console pyspark et jupyter

5
Chevelle

Téléchargez le pilote JDBC PostgreSQL depuis https://jdbc.postgresql.org/download.html

Remplacez ensuite les valeurs de configuration de la base de données par les vôtres.

from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL basic example") \
    .config("spark.jars", "/path_to_postgresDriver/postgresql-42.2.5.jar") \
    .getOrCreate()

df = spark.read \
    .format("jdbc") \
    .option("url", "jdbc:postgresql://localhost:5432/databasename") \
    .option("dbtable", "tablename") \
    .option("user", "username") \
    .option("password", "password") \
    .option("driver", "org.postgresql.Driver") \
    .load()

df.printSchema()

Plus d'informations: https://spark.Apache.org/docs/latest/sql-data-sources-jdbc.html

3
Rafael

Vous avez normalement besoin soit:

  1. pour installer le pilote Postgres sur votre cluster,
  2. pour fournir le pot de pilotes Postgres de votre client avec l'option --jars
  3. ou pour fournir les coordonnées maven du pilote Postgres avec l'option --packages.

Si vous expliquez comment vous lancez pyspark, nous pouvons vous donner plus de détails.

Quelques indices/idées:

spark-can't-find-the-postgres-jdbc-driver

Impossible de se connecter à postgres en utilisant jdbc dans pyspark Shell

2
MiguelPeralvo

Une approche, s'appuyant sur l'exemple du guide de démarrage rapide , est ce billet de blog qui montre comment ajouter le --packages org.postgresql:postgresql:9.4.1211 argument à spark-submit commande.

Cela télécharge le pilote into ~/.ivy2/jars répertoire, dans mon cas /Users/derekhill/.ivy2/jars/org.postgresql_postgresql-9.4.1211.jar. Passer ceci comme --driver-class-path option donne la commande spark-submit complète de:

/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

Et en 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()
2
Derek Hill

Cette exception signifie que le pilote jdbc ne se trouve pas dans le chemin de classe du pilote. vous pouvez lancer des jars jdbc avec --jar, ajoutez-le également dans le chemin de classe du pilote à l'aide de spark.driver.extraClassPath.

0
Shawn Guo