2016-07-12 23 views
0

Ich habe Daten in einer Postgres-Datenbank, auf die ich über Spark as a Service auf IBM Bluemix (mit einem Python-Notizbuch) zugreifen möchte. Hier ist mein Code:Zugriff auf Daten in einer Compose PostgreSQL-Datenbank von Spark as a Service Python-Notizbuch auf Bluemix

from pyspark.sql import SQLContext 
sqlContext = SQLContext(sc) 

df = sqlContext.load(source="jdbc",\ 
       url="jdbc:postgresql://[publichost]:[port]/compose",\ 
       dbtable="[tablename]") 
df.take(2) 

Der Fehler Ich erhalte (während der df = Linie):

Py4JJavaError: An error occurred while calling o42.load. 
: java.sql.SQLException: No suitable driver found for jdbc:postgresql://host:port/compose 
at java.sql.DriverManager.getConnection(DriverManager.java:700) 
at java.sql.DriverManager.getConnection(DriverManager.java:219) 
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$$anonfun$getConnector$1.apply(JDBCRDD.scala:188) 
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$$anonfun$getConnector$1.apply(JDBCRDD.scala:181) 
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:121) 
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation.<init>(JDBCRelation.scala:91) 
at org.apache.spark.sql.execution.datasources.jdbc.DefaultSource.createRelation(DefaultSource.scala:60) 
at org.apache.spark.sql.execution.datasources.ResolvedDataSource$.apply(ResolvedDataSource.scala:158) 
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:119) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231) 
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:381) 
at py4j.Gateway.invoke(Gateway.java:259) 
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133) 
at py4j.commands.CallCommand.execute(CallCommand.java:79) 
at py4j.GatewayConnection.run(GatewayConnection.java:209) 
at java.lang.Thread.run(Thread.java:785) 

Kann ich diesen Treiber aktualisieren? Jeder Rat oder ein Arbeitsbeispiel würde sehr geschätzt werden!

+0

Es ist möglich, Treiber zu ändern oder zu installieren/deinstallieren. Ich tat dies hier für DB2-Treiber https://github.com/data-henrik/CeBIT-Weather/blob/master/CeBIT_Weather2.ipynb –

Antwort

1

Dies passiert, weil der Postgresql-Treiber nicht standardmäßig in Ihrer Spark Service-Instanz installiert ist.

Sie müssten es zuerst hinzufügen, um es zu verwenden.

Change the kernel to Scala from the menu to execute below statement, you only need to execute this once per spark instance and then subsequent use postgres driver irrespective of kernel type(Python,Scala,R), you can simply import it 
In [1]: 
%Addjar -f https://jdbc.postgresql.org/download/postgresql-9.4.1207.jre7.jar 
Starting download from https://jdbc.postgresql.org/download/postgresql-9.4.1207.jre7.jar 
Finished download of postgresql-9.4.1207.jre7.jar 
In [5]: 
#Now change the kernel back to Python 
In [1]: 
from pyspark.sql import SQLContext 
sqlContext = SQLContext(sc) 
In [3]: 
#Ignore the Connection Error which is because of the invalid connection details 
#Just simply change the publichost to your hostname and port number and databasename and 
#tablename 
In [4]: 
df = sqlContext.load(source="jdbc",\ 
       url="jdbc:postgresql://[publichost]:[port]/databasename",\ 
       dbtable="[tablename]") 

komplette Importierbare Notebook Siehe unten https://github.com/charles2588/bluemixsparknotebooks/raw/master/Python/python_postgres.ipynb

Danke, Charles.