簡體   English   中英

Simba JDBC驅動程序For Cloud Spanner與Spark JDBC DataFrame閱讀器一起使用

[英]Simba JDBC driver For Cloud Spanner used with Spark JDBC DataFrame reader

我正在使用Simba Technologies Inc的JDBC驅動程序來連接Google雲扳手。 它與Java.sql一起運行。 什么時候,我嘗試將simba JDBC驅動程序與Spark的JDBC閱讀器一起使用,以便將查詢輸出作為DataFrame讀取,但是它提供了錯誤的輸出。

這是我的扳手表

UserID  UserName
1   Vaijnath
2   Ganesh
3   Rahul

元數據: UserID(String)
用戶名(字符串)

我正在執行Query as:SELECT * FROM users

當我使用帶有Java Sql的Simba JDBC驅動程序時,此查詢獲取正確的數據,但是當我將它與Spark SQL的JDBC讀取器一起使用時,它無法獲取數據。

它返回DataFrame作為

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

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

這是我正在使用的代碼:

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)
    }
}

我的問題是,我可以在Spark中使用Simba JDBC Driver嗎? 如果是,那么我需要添加多少額外的東西。 任何幫助贊賞。

發生這種情況是因為Spark默認使用雙引號(“)引用所有標識符,這意味着正在生成以下查詢:

SELECT "UserID", "UserName" FROM USERS

Cloud Spanner將其解釋為選擇兩個固定字符串。 它在大多數其他數據庫中基本相同:

SELECT 'UserID', 'UserName' FROM USERS

Google Cloud Spanner使用反引號(`)來引用標識符,並期望:

SELECT `UserID`, `UserName` FROM USERS

要解決此問題,您需要為Google Cloud Spanner注冊特定的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();

請注意,我沒有使用Simba驅動程序測試上述內容,但僅使用此驅動程序: https//github.com/olavloite/spanner-jdbc我想它也應該與Simba驅動程序一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM