用于Cloud Spanner的Simba JDBC驱动程序与Spark JDBC DataFrame阅读器一起使用

Vaijnath Polsane

我正在使用Simba Technologies Inc的JDBC驱动程序来与Google云扳手连接。它正在使用Java.sql正常运行。当时,我尝试将simba JDBC驱动程序与Spark的JDBC阅读器一起使用,以便将查询输出作为DataFrame读取,但是它给出了错误的输出。

这是我的扳手表

UserID  UserName
1   Vaijnath
2   Ganesh
3   Rahul

元数据: UserID(字符串)
UserName(字符串)

我正在执行查询:SELECT * FROM users

当我将Simba JDBC驱动程序与Java Sql一起使用时,此查询将获取正确的数据,但当与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)
    }
}

我的问题是,我可以将Simba JDBC驱动程序与Spark一起使用吗?如果是,那我还需要补充些什么。任何帮助表示赞赏。

纳特·奥拉夫·莱特

发生这种情况是因为默认情况下,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驱动程序一起工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用了错误的JDBC驱动程序?

使用Google Cloud SQL JDBC驱动程序时如何刷新OAuth令牌?

无法使用AWS EMR实例通过Spark访问JDBC驱动程序

Spark无法使用JDBC瘦驱动程序连接到Ignite

如何确定要用于JDBC的驱动程序

在具有Maven(Java)的服务器上找不到适用于jdbc:mysql的驱动程序

将JDBI与不支持预准备语句的JDBC驱动程序一起使用

我还想念什么?我收到一个错误:找不到适用于jdbc的驱动程序

jdbc 驱动程序和连接器之间的区别

将NetBeans IDE的数据库管理器与UCanAccess JDBC驱动程序一起使用

无法使用 PostgreSQL JDBC 驱动程序通过 SSL 连接

如何选择要使用的JDBC驱动程序?

如何从任意位置使用JDBC驱动程序

使用其他版本的JDBC驱动程序

如何使用Oracle jdbc驱动程序fixedString属性?

我应该使用哪个Informix JDBC驱动程序?

无法使用jdbc驱动程序连接到mysql

使用UCanAccess JDBC驱动程序格式化日期

JDBC DriverManager尝试使用未指定的Oracle驱动程序

使用JDBC驱动程序创建一个Android Studio项目以在Google Cloud SQL服务器上运行查询

使用Tomcat-DBCP的JDBC需要Tomcat自己的/ lib中的JDBC驱动程序

无法使用Jmeter创建类'com.microsoft.sqlserver.jdbc.SQLServerDriver'的JDBC驱动程序

JDBC驱动程序与网桥

加载JDBC驱动程序

最快的JDBC驱动程序

Athena 使用 ALTER TABLE ADD PARTITION 抛出 Simba JDBC 11300

在应用程序映像上找不到适用于jdbc:sqlite的驱动程序

在Spark中找不到适合jdbc的驱动程序

Spark 无法从 SBT 找到 JDBC 驱动程序