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:
Une idée pourquoi cela se produit-il?
Edit : J'essaie d'exécuter le code localement sur mon ordinateur.
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
.
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
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
Vous avez normalement besoin soit:
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
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()
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
.