2016-04-08 17 views
3

我想在Spark中使用JDBC從MS SQL表(在Azure中)中讀取並將其保存爲實例文件(本地或S3)。我在本地工作,但當Spark在EC2上時我無法工作。在啓動時向PySpark添加JDBC驅動程序而不使用配置文件

我的本地版本的作品,因爲我手動打開我的火花defaults.conf文件,加入**:

spark.driver.extraClassPath /Users/<my_user>/spark-1.6.1-bin-hadoop2.4/lib/postgresql-9.4.1208.jre6.jar:/Users/<my_user>/spark-1.6.1-bin-hadoop2.4/lib/sqljdbc4.jar 

**我只需要MSSQL爲這個特定使用案例

使用EC2我試着做以下幾點:

wget https://download.microsoft.com/download/0/2/A/02AAE597-3865-456C-AE7F-613F99F850A8/sqljdbc_6.0.7130.100_enu.tar.gz 

tar -xf sqljdbc_6.0.7130.100_enu.tar.gz 

ls 

./spark/bin/pyspark --packages com.databricks:spark-csv_2.11:1.2.0 --driver-class-path "/root/sqljdbc_6.0/enu/sqljdbc4.jar" 

然後從內部的Python我這樣做:

sqlserver_user = <my_sql_user> 
sqlserver_pw = <my_sql_pw> 

sqlserver_<my_database>_url = "jdbc:sqlserver://<my_server>.cloudapp.net:<port_num>;DatabaseName=<my_db>;user=<my_user>;password=<my_password>;" 

my_jdbc_test = sqlContext.load(
    source="jdbc", 
    url=sqlserver_<my_database>_url, 
    dbtable=<my_table> 
    ) 

my_jdbc_test.printSchema() 

my_jdbc_test.printSchema()正確顯示模式:

>>> my_jdbc_test.printSchema() 
root 
|-- my_var1: string (nullable = true) 
|-- my_var2: string (nullable = true) 
|-- my_var3: string (nullable = false) 

>>> 

然而,當我嘗試將其保存到我的本地磁盤作爲地板的文件,我得到一個驅動程序錯誤:

my_jdbc_test.write.save("my_jdbc_test", format="parquet") 

No suitable driver found for jdbc:sqlserver://<my_server>.cloudapp.net:<port_num>;DatabaseName=<my_db>;user=<my_user>;password=<my_password>; 

因爲它可以正確地顯示我假設它是因爲jar被添加到主節點,但可能錯誤的來源是它沒有被推送到工作節點?我搜查了一噸,找不到任何東西。

在此先感謝。

+0

你可以試試:my_jdbc_test.write.save(「my_jdbc_test.parquet」,format =「parquet」)? –

回答

0

根據問題信息,它是由SQL數據庫驅動程序&連接字符串引起的。 jdbc驅動程序&連接字符串用於Java,不適用於Python。

因此,您需要爲Python使用odbc驅動程序和連接字符串,請嘗試安裝Python包pymssql以通過參考文檔http://pymssql.org/en/stable/訪問SQL數據庫。

ODBC與Python的連接字符串如下所示。

Driver={SQL Server Native Client 10.0};Server=tcp:<your-server>.database.windows.net,1433;Database=<my_db>;Uid=<your-username>@<your-server>;Pwd={your_password_here};Encrypt=yes;Connection Timeout=30;

如果你必須使用JDBC驅動程序和連接字符串,你可以嘗試參考文檔Databases and Jython: Object Relational Mapping and Using JDBC使用的Jython,而不是Python的。

任何問題,請隨時讓我知道。

+0

嗨@Peter,謝謝你的回覆。 –

+0

我對你的回答感到困惑,因爲當我修改配置文件(例如上面的本地示例)時,JDBC工作得很好。我只是試圖在初始化期間通過命令行指向它,而不是通過配置文件。所以對我而言,這實際上並不是一個JDBC問題,因爲這一切都可以正常工作,這是一個PySpark初始化問題:在啓動期間如何指向JAR文件以獲取JDBC驅動程序到所有節點?我有驅動程序在master上工作或'printSchema()'不起作用。 –

相關問題