2016-08-08 5 views
1

スパーククラスタの設定は、次のとおりです。書き込みスパークデータフレームは

conf['SparkConfiguration'] = SparkConf() \ 
.setMaster('yarn-client') \ 
.setAppName("test") \ 
.set("spark.executor.memory", "20g") \ 
.set("spark.driver.maxResultSize", "20g") \ 
.set("spark.executor.instances", "20")\ 
.set("spark.executor.cores", "3") \ 
.set("spark.memory.fraction", "0.2") \ 
.set("user", "test_user") \ 
.set("spark.executor.extraClassPath", "/usr/share/java/postgresql-jdbc3.jar") 

私は次のコードを使用してPostgresのDBへのデータフレームを書き込もう:私が遭遇

from pyspark.sql import DataFrameWriter 
my_writer = DataFrameWriter(df) 

url_connect = "jdbc:postgresql://198.123.43.24:1234" 
table = "test_result" 
mode = "overwrite" 
properties = {"user":"postgres", "password":"password"} 

my_writer.jdbc(url_connect, table, mode, properties) 

を下のエラー:

Py4JJavaError: An error occurred while calling o1120.jdbc. 
:java.sql.SQLException: No suitable driver 
    at java.sql.DriverManager.getDriver(DriverManager.java:278) 
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$2.apply(JdbcUtils.scala:50) 
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$2.apply(JdbcUtils.scala:50) 
at scala.Option.getOrElse(Option.scala:120) 
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.createConnectionFactory(JdbcUtils.scala:49) 
at org.apache.spark.sql.DataFrameWriter.jdbc(DataFrameWriter.scala:278) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
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:745) 

誰でもこれについていくつかの提案を提供できますか? ありがとうございました!

答えて

0

たぶん、あなたは(あなたがすべてのスパークのノードのクラスパスにドライバのjarファイルを配置する必要があるかもしれないことに注意してください)明示的にJDBCドライバクラスを渡して試すことができます:

df.write.option('driver', 'org.postgresql.Driver').jdbc(url_connect, table, mode, properties) 
+0

感謝応答。 TypeError: 'DataFrameWriter'オブジェクトは呼び出し可能ではありません – Yiliang

+1

@Yiliang、申し訳ありませんが、pysparkの 'write'は関数ではないので、' df.write() 'の代わりに' df.write'を実行する必要があります。私の間違い –

+0

@Yiliang答えが編集されました。 –

1

write.jdbcを試してみて、個別にパラメータを渡しますwrite.jdbc()の外部で作成されます。 また、Postgresが書き込み可能なポートを確認するには、Postgres 9.6では5432、Postgres 8.4では5433が必要です。

mode = "overwrite" 
url = "jdbc:postgresql://198.123.43.24:5432/kockpit" 
properties = {"user": "postgres","password": "password","driver": "org.postgresql.Driver"} 
data.write.jdbc(url=url, table="test_result", mode=mode, properties=properties) 
1

PostgreSQL JDBCドライバをダウンロードしましたか?ここからダウンロード:https://jdbc.postgresql.org/download.html。あなたはSPARK_CLASSPATH環境変数を使用pysparkシェルの

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

使用をスパーク提出--driverクラスパスフラグを経由してスクリプトを提出する場合:用

$ spark-submit --driver-class-path /path/to/downloaded/jar script.py 
関連する問題