以前にもこの質問をしましたが、回答がありませんでした( pyspark Shellでjdbcを使用してpostgresに接続できません )。
ローカルウィンドウにSpark 1.3.0を正常にインストールし、サンプルプログラムを実行してpysparkShellを使用してテストしました。
ここで、Postgresqlに保存されているデータに対してMllibから相関を実行したいのですが、postgresqlに接続できません。
を実行して、クラスパスに必要なjarを正常に追加しました(このjarをテストしました)
pyspark --jars "C:\path\to\jar\postgresql-9.2-1002.jdbc3.jar"
Jarが環境UIに正常に追加されていることがわかります。
PysparkShellで以下を実行すると-
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.load(source="jdbc",url="jdbc:postgresql://[Host]/[dbname]", dbtable="[schema.table]")
このエラーが発生します-
>>> df = sqlContext.load(source="jdbc",url="jdbc:postgresql://[Host]/[dbname]", dbtable="[schema.table]")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\ACERNEW3\Desktop\Spark\spark-1.3.0-bin-hadoop2.4\python\pyspark\sql\context.py", line 482, in load
df = self._ssql_ctx.load(source, joptions)
File "C:\Users\ACERNEW3\Desktop\Spark\spark-1.3.0-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.Zip\py4j\Java_gateway.py", line 538, in __call__
File "C:\Users\ACERNEW3\Desktop\Spark\spark-1.3.0-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.Zip\py4j\protocol.py", line 300, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o20.load.
: Java.sql.SQLException: No suitable driver found for jdbc:postgresql://[Host]/[dbname]
at Java.sql.DriverManager.getConnection(DriverManager.Java:602)
at Java.sql.DriverManager.getConnection(DriverManager.Java:207)
at org.Apache.spark.sql.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:94)
at org.Apache.spark.sql.jdbc.JDBCRelation.<init> (JDBCRelation.scala:125)
at org.Apache.spark.sql.jdbc.DefaultSource.createRelation(JDBCRelation.scala:114)
at org.Apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:290)
at org.Apache.spark.sql.SQLContext.load(SQLContext.scala:679)
at org.Apache.spark.sql.SQLContext.load(SQLContext.scala:667)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
at Java.lang.reflect.Method.invoke(Method.Java:597)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.Java:231)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.Java:379)
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:207)
at Java.lang.Thread.run(Thread.Java:619)
私はmysql/mariadbでこの正確な問題を抱えていて、 この質問 から大きな手がかりを得ました
したがって、pysparkコマンドは次のようになります。
pyspark --conf spark.executor.extraClassPath=<jdbc.jar> --driver-class-path <jdbc.jar> --jars <jdbc.jar> --master <master-URL>
また、「警告:ローカルjar ...が存在しません、スキップします」などのpysparkの起動時のエラーにも注意してください。および「ERRORSparkContext:Jar not found at ...」、これらはおそらくパスのスペルが間違っていることを意味します。
もう少しエレガントな解決策:
val props = new Properties
props.put("driver", "org.postgresql.Driver")
sqlContext.read.jdbc("jdbc:postgresql://[Host]/[dbname]", props)
Jake256が示唆したように
「ドライバー」、「org.postgresql.Driver」
キーと値のペアがありませんでした。私の場合、pysparkを次のように起動しました:
pyspark --jars /path/to/postgresql-9.4.1210.jar
次の手順で:
from pyspark.sql import DataFrameReader
url = 'postgresql://192.168.2.4:5432/postgres'
properties = {'user': 'myUser', 'password': 'myPasswd', 'driver': 'org.postgresql.Driver'}
df = DataFrameReader(sqlContext).jdbc(
url='jdbc:%s' % url, table='weather', properties=properties
)
df.show()
+-------------+-------+-------+-----------+----------+
| city|temp_lo|temp_hi| prcp| date|
+-------------+-------+-------+-----------+----------+
|San Francisco| 46| 50| 0.25|1994-11-27|
|San Francisco| 43| 57| 0.0|1994-11-29|
| Hayward| 54| 37|0.239999995|1994-11-29|
+-------------+-------+-------+-----------+----------+
テスト済み:
Ubuntu 16.04
PostgreSQLサーバーバージョン9.5。
使用されるPostgresqlドライバーはpostgresql-9.4.1210.jarです。
およびSparkバージョンはspark-2.0.0-bin-hadoop2.6です
しかし、spark-2.0.0-bin-hadoop2.7でも機能するはずだと確信しています。
Java JDK 1.864ビット
他のJDBCドライバーは次の場所にあります: https://www.petefreitag.com/articles/jdbc_urls/
私が従ったチュートリアルは次のとおりです: https://developer.ibm.com/clouddataservices/2015/08/19/speed-your-sql-queries-with-spark-sql/
同様の解決策が次の場合にも提案されました: pyspark mysql jdbc load o23.loadの呼び出し中にエラーが発生しました適切なドライバーがありません
この投稿を参照してください。すべてのオプションの後にスクリプトを配置してください。 これを参照
間違ったバージョンのJDBCドライバーを使用すると、このエラーがスローされるようです。 https://jdbc.postgresql.org/download.html をチェックして、正しいものがあることを確認します。
特に注意してください:
JDK 1.1-JDBC 1.8.0リリースではJDBC1のサポートが削除されているため、サーバーを更新するときにJDKを更新するようにしてください。
JDK 1.2、1.3-JDBC 2. JDK 1.3 + J2EE-JDBC2EE。これには、javax.sqlクラスの追加サポートが含まれています。
JDK 1.4、1.5-JDBC3。これにはSSLおよびjavax.sqlのサポートが含まれていますが、J2SEリリースに追加されているためJ2EEは必要ありません。 JDK1.6-JDBC4。 JDBC4メソッドのサポートは完全ではありませんが、メソッドの大部分は実装されています。
JDK 1.7、1.8-JDBC41。 JDBC4メソッドのサポートは完全ではありませんが、メソッドの大部分は実装されています。