RedshiftデータをZeppelinのデータフレームに読み込む必要があります。ここ数ヶ月間、AWSのZeppelin経由でSpark 2.0を使用して、csvファイルとjson S3ファイルを正常に開くことができました。Zeppelin Spark 2.0とPysparkを使ったAWS Redshiftへの接続
私はこのコードを使用して、スパーク1.6.2(多分1.6.1)とAWS EMRにツェッペリンから赤方偏移に接続することができるように使用される:
%pyspark
from pyspark.sql import SQLContext, Row
import sys
from pyspark.sql.window import Window
import pyspark.sql.functions as func
#Load the data
aquery = "(SELECT serial_number, min(date_time) min_date_time from schema.table where serial_number in ('abcdefg','1234567') group by serial_number) as minDates"
dfMinDates = sqlContext.read.format('jdbc').options(url='jdbc:postgresql://dadadadaaaredshift.amazonaws.com:5439/idw?tcpKeepAlive=true&ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory?user=user&password=password', dbtable=aquery).load()
dfMinDates.show()
、それが働きました。それは2016年の夏でした。
私はそれ以来、AWSにはSpark 2.0が必要です。
新しい構文が
myDF = spark.read.jdbcこのようなものです:
%pyspark
aquery = "(SELECT serial_number, min(date_time) min_date_time from schema.table where serial_number in ('abcdefg','1234567') group by serial_number) as minDates"
dfMinDates = spark.read.jdbc("jdbc:postgresql://dadadadaaaredshift.amazonaws.com:5439/idw?tcpKeepAlive=true&ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory?user=user&password=password", dbtable=aquery).load()
dfMinDates.show()
が、私はこのエラーを取得:
Py4JJavaError: An error occurred while calling o119.jdbc. : java.sql.SQLException: No suitable driver at java.sql.DriverManager.getDriver(DriverManager.java:315) at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$2.apply(JdbcUtils.scala:54) at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$2.apply(JdbcUtils.scala:54) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.createConnectionFactory(JdbcUtils.scala:53) at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:123) at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation.(JDBCRelation.scala:117) at org.apache.spark.sql.DataFrameReader.jdbc(DataFrameReader.scala:237) at org.apache.spark.sql.DataFrameReader.jdbc(DataFrameReader.scala:159) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:237) at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) at py4j.Gateway.invoke(Gateway.java:280) at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:128) at py4j.commands.CallCommand.execute(CallCommand.java:79) at py4j.GatewayConnection.run(GatewayConnection.java:211) at java.lang.Thread.run(Thread.java:745) (, Py4JJavaError(u'An error occurred while calling o119.jdbc.\n', JavaObject id=o121),)
私はスパーク2.0のドキュメントを調査し、これが見つかりました:
The JDBC driver class must be visible to the primordial class loader on the client session and on all executors. This is because Java’s DriverManager class does a security check that results in it ignoring all drivers not visible to the primordial class loader when one goes to open a connection. One convenient way to do this is to modify compute_classpath.sh on all worker nodes to include your driver JARs.
私はこれを実装する方法を知っていると、様々なポスト、いくつかのブログやstackoverflowの中にいくつかの記事からより多くの読み取りを行なったし、見つかっていないこの私がやった
spark.driver.extraClassPath = org.postgresql.Driver
これはZeppelinのInterpreter設定ページにも表示されますが、同じエラーが表示されます。
私はPostgresインタプリタを追加しようとしましたが、SparkインタプリタまたはPythonインタプリタに入れるかどうかわからないため、正しく実行したとは思いません。私はSparkインタプリタを選択しました。今やPostgresインタプリタにはSparkインタプリタと同じ設定がありますが、これは問題ではないかもしれませんが、同じエラーが出ます。
スパーク1.6では、この問題をすべて克服したことを覚えていません。
実験として、私はSpark 1.6.2でEMRクラスタをスピンアップし、以前使用していた古いコードを試してみたところ、上記と同じエラーが発生しました。
ZeppelinサイトにはPostgresがありますが、その情報はインタプリタの設定方法ではなくコードのように見えるため、使用方法はわかりません。
私はアイデアや参考資料がありません。
何か提案がありがとうございます!
本当にありがとうございました!私はそれをアーティファクトとしてツェッペリンの通訳のページに追加しました。 – PLB