1

我需要將紅移數據讀入Zeppelin的數據框。在過去的幾個月裏,我通過AWS上的Zeppelin使用Spark 2.0成功打開了csv和json S3文件。使用Zeppelin Spark 2.0和Pyspark連接到AWS Redshift

我曾經是能夠連接從飛艇到紅移在AWS EMR星火1.6.2(也許1.6.1),使用此代碼:

%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.

我不知道如何實現這一點,並從不同的崗位,一些博客和計算器中的一些職位,做了更多的閱讀,發現這個:

spark.driver.extraClassPath = org.postgresql.Driver

我做這在Zeppelin的Interpreter設置頁面中,但我仍然得到相同的錯誤。

我試着添加一個Postgres解釋器,我不確定是否正確(因爲我不確定是否把它放在Spark解釋器或Python解釋器中),我選擇了Spark解釋器。現在Postgres解釋器也具有與Spark解釋器完全相同的設置,這可能無關緊要,但仍然會出現相同的錯誤。

在Spark 1.6中,我只是不記得經歷過所有這些麻煩。

作爲一個實驗,我使用Spark 1.6.2創建了一個EMR集羣,並嘗試了過去工作的舊代碼,並得到了與上面相同的錯誤!

Zeppelin網站有Postgres覆蓋,但他們的信息看起來像代碼而不是如何設置解釋器,所以我不知道如何使用它。

我出來的想法和參考。

任何建議非常感謝!

回答

1

您需要使用亞馬遜的Redshift特定驅動程序。您可以從這裏下載:http://docs.aws.amazon.com/redshift/latest/mgmt/configure-jdbc-connection.html

但是,如果您正在使用EMR,它已經就位(在/usr/share/aws/redshift/jdbc/RedshiftJDBC41.jar),您可以告訴Zeppelin它在哪裏。

以下是如何申報:AWS Redshift driver in Zeppelin

+1

非常感謝!我將它添加到Zeppelin的解釋器頁面中作爲一個神器,它的工作原理! – PLB

相關問題