2016-02-26 16 views
11

Sto usando PySpark su Spark 1.5 su Cloudera YARN, usando Python 3.3 su Centos 6 Machines. L'istanza di SQL Server è SQL Server Enterprise a 64 bit. Il driver di SQL Server è elencato di seguito; sqljdbc4.jar; e ho aggiunto alla mia .bashrcPySpark 1.5 & MSSQL jdbc

export SPARK_CLASSPATH="/var/lib/spark/sqljdbc4.jar" 
export PYSPARK_SUBMIT_ARGS="--conf spark.executor.extraClassPath="/var/lib/spark/sqljdbc4.jar" --driver-class-path="/var/lib/spark/sqljdbc4.jar" --jars="/var/lib/spark/sqljdbc4.jar" --master yarn --deploy-mode client" 

E posso vedere la conferma quando lancio scintilla che

SPARK_CLASSPATH was detected (set to '/var/lib/spark/sqljdbc4.jar') 

Ho un dataframe che assomiglia a questo schema

root 
|-- daytetime: timestamp (nullable = true) 
|-- ip: string (nullable = true) 
|-- tech: string (nullable = true) 
|-- th: string (nullable = true) 
|-- car: string (nullable = true) 
|-- min_dayte: timestamp (nullable = true) 
|-- max_dayte: timestamp (nullable = true) 

ho ho creato una tabella vuota già nel mio server MS SQL chiamato 'dbo.shaping', dove le 3 colonne di data/ora saranno datetime2 (7) e le altre nvarchar (50).

cerco di esportare il dataframe da PySpark utilizzare questo

properties = {"user": "<username>", "password": "<password>"} 

df.write.format('jdbc').options(url='<IP>:1433/<dbname>', dbtable='dbo.shaping',driver="com.microsoft.sqlserver.jdbc.SQLServerDriver",properties=properties) 

ottengo l'errore seguente traceback

Py4JError: An error occurred while calling o250.option. Trace: 
py4j.Py4JException: Method option([class java.lang.String, class java.util.HashMap]) does not exist 
at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:333) 
at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:342) 
at py4j.Gateway.invoke(Gateway.java:252) 
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:744) 

sono i miei metodi almeno corretti, e forse questo errore è di scrivere il tipo specifico di dati, ad esempio, ho un problema con il costrutto di dati e non il mio codice?

+1

Stai riesumare una domanda che è più di un anno di età. Hai verificato che sia ancora pertinente come richiesto (a fronte di cose come le versioni più recenti del software)? –

+0

Gli aggiornamenti software non sono possibili su questo argomento. Deve essere la soluzione pyspark 1.5. – PR102012

+1

pyspark 1.5 è una cosa, ma anche il driver Microsoft JDBC per SQL Server ha subito aggiornamenti. Il tuo errore ha tutti i tratti distintivi di una mancata corrispondenza di versione tra i componenti, non è abbastanza chiaro quali. Raccomando di elencare esplicitamente i numeri di versione di tutto ciò che state usando (python, pyspark, driver JDBC, SQL Server, OS), altrimenti c'è poca speranza che qualcuno lo riproduca. (Questo è anche il motivo per cui sono scettico sul fatto che questo è "ampiamente applicabile a un vasto pubblico", ma non ho esperienza con pyspark.) –

risposta

6

Non è possibile utilizzare un dict come valore per options. Il metodo options prevede solo gli argomenti str (Scala docs e PySpark annotations) ed è esteso per separare le chiamate su Java option.

Nelle versioni correnti di Spark il valore è automatically converted to string, pertanto il codice non funzionerà correttamente, ma it isn't the case in 1.5.

Dal properties sono specifici per driver JDBC in ogni caso, si consiglia di utilizzare jdbc metodo:

properties = { 
    "user": "<username>", "password": "<password>", "driver": 
    "com.microsoft.sqlserver.jdbc.SQLServerDriver"} 

df.write.jdbc(
    url='<IP>:1433/<dbname>', 
    table='dbo.shaping', 
    properties=properties) 

se proprietà spacchettamento dovrebbero funzionare così:

.options(
    url='<IP>:1433/<dbname>', 
    dbtable='dbo.shaping', 
    driver="com.microsoft.sqlserver.jdbc.SQLServerDriver", 
    **properties) 

In generale, quando si vede:

py4j.Py4JException: Method ... does not exist 

segnala solitamente la mancata corrispondenza tra la posizione tipi di Python e tipi previsti dal metodo JVM in uso.

Consulta anche: How to use JDBC source to write and read data in (Py)Spark?

+0

Includo le proprietà per "utente", "password" e "driver"; come tu hai quiTuttavia, ora sto ricevendo l'errore "Py4JJavaError: si è verificato un errore durante la chiamata a o230.jdbc. : java.sql.SQLException: nessun driver adatto trovato per '. .. E 'possibile b/c Sono su YARN, che il file .jar che è il driver e incluso nel mio .bashrc sul mio nodo Mgmt/Execution, non è nella stessa directory in ogni altro nodo non-master? Quindi, quando uso più nodi, alcuni non hanno il barattolo? – PR102012

+0

Il driver JDBC deve essere presente su ogni nodo di lavoro. Personalmente userei l'opzione '--packages', pensata in modalità client, dovresti essere in grado di passare jar locale con' --jars'. – zero323