3

我使用Simba Technologies Inc的JDBC驅動程序與Google雲端扳手連接。它按照預期使用Java.sql運行。當我嘗試在Spark的JDBC閱讀器中使用simba JDBC驅動程序來讀取作爲DataFrame的查詢輸出,但它輸出錯誤。Simba JDBC驅動程序適用於Cloud Spanner,用於Spark JDBC DataFrame讀取器

這裏是我的扳手錶

UserID UserName 
1 Vaijnath 
2 Ganesh 
3 Rahul 

的元數據: 用戶ID(字符串)
用戶名(字符串)

我執行查詢爲:SELECT * FROM用戶

此查詢獲取正確的數據,當我在Java Sql中使用Simba JDBC驅動程序,但無法獲取數據當我將它用於Spark SQL的JDBC閱讀器時。

它返回數據幀作爲

+------+--------+ 
|UserID|UserName| 
+------+--------+ 
|UserID|UserName| 
|UserID|UserName| 
|UserID|UserName| 
+------+--------+ 

我們可以看到,它返回正確的元數據和行數,但是,行包含列名。

這裏是代碼我使用:

import java.util.Properties 
import org.apache.spark.sql.{DataFrame, SparkSession} 

object spannerIn { 
    val sparkSession =SparkSession 
      .builder() 
      .appName("Spark SQL basic example").master("local") 
      .config("spark.sql.warehouse.dir", "file:///tmp") 
      .config("spark.sql.shuffle.partitions", 1) 
      .getOrCreate() 

    val properties =new Properties() 
    properties.setProperty("user", "") 
    properties.setProperty("password", "") 
    properties.setProperty("driver", "com.simba.cloudspanner.core.jdbc42.CloudSpanner42Driver") 

    val connectionURL="jdbc:cloudspanner://localhost;Project=abc;Instance=pqr;Database=xyz;PvtKeyPath=FilePath" 
    val selectQuery="(select * from users)" 
    def main(args: Array[String]): Unit = { 
      val df = createJdbcDataframe() 
      df.show() 
    } 
    def createJdbcDataframe(): DataFrame = { 
    sparkSession.read.jdbc(connectionURL, selectQuery, properties) 
    } 
} 

我的問題是,我可以用星火辛巴JDBC驅動程序? 如果是,那麼我需要添加什麼額外的東西。 任何幫助讚賞。

回答

2

這是因爲正在產生火花默認報價用雙引號(「),這意味着下面的查詢所有標識符:

SELECT "UserID", "UserName" FROM USERS 

這是由雲扳手解釋爲選擇兩個固定的字符串它基本上是。在大多數其他數據庫一樣的:

SELECT 'UserID', 'UserName' FROM USERS 

谷歌雲扳手用來引用標識符反引號('),並預計這樣的:

SELECT `UserID`, `UserName` FROM USERS 

要解決這個問題,你需要註冊爲谷歌雲扳手特定的JDBC方言和註冊反引號的報價是這樣的:

Class.forName("nl.topicus.jdbc.CloudSpannerDriver"); 
    SparkSession spark = SparkSession.builder().appName("Java Spark SQL basic example") 
       .config("spark.some.config.option", "some-value").master("local").getOrCreate(); 
    String sparkURL = "jdbc:cloudspanner://localhost;Project=project-id;Instance=instance-id;Database=db;PvtKeyPath=pathToKeyFile.json"; 
    JdbcDialects.registerDialect(new JdbcDialect() 
    { 
     private static final long serialVersionUID = 1L; 

     @Override 
     public boolean canHandle(String url) 
     { 
      return url.toLowerCase().startsWith("jdbc:cloudspanner:"); 
     } 

     @Override 
     public String quoteIdentifier(String column) 
     { 
      return "`" + column + "`"; 
     } 
    }); 
    Dataset<Row> dataset = spark.read().jdbc(sparkURL, "ACCOUNT", new Properties()); 
    dataset.show(); 

請注意,我沒有測試過上述與辛巴司機,但只有這個驅動程序:https://github.com/olavloite/spanner-jdbc 我想它應該也適用於Simba驅動程序。

相關問題