当前位置: 首页 > 知识库问答 >
问题:

Simba JDBC驱动程序用于与Spark JDBC DataFrame阅读器一起使用的云扳手

计燕七
2023-03-14

我正在使用辛巴科技公司的JDBC驱动程序与谷歌云扳手连接。它在 Java .sql 中按预期运行。当,我试图将simba JDBC驱动程序与Spark的JDBC读取器一起使用,以便将查询输出读取为数据帧,但是,它给出了错误的输出。

这是我的扳手台:

UserID  UserName
1   Vaijnath
2   Ganesh
3   Rahul

元数据:UserID(字符串)< br >用户名(字符串)

我正在执行查询:选择*来自用户

当我将 Simba JDBC 驱动程序与 Java Sql 一起使用时,此查询会获取正确的数据,但是当我将其与 Spark SQL 的 JDBC 读取器一起使用时,它无法获取数据。

它将DataFrame返回为

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

我的问题是,我可以在Spark中使用Simba JDBC驱动程序吗?如果是,那么我还需要补充什么。任何帮助,谢谢。

共有1个答案

凌蕴藉
2023-03-14

这是因为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驱动上工作。

 类似资料:
  • 我需要将升级到。 Microsoft网站有以下信息: sqljdbc41.jar ;类库提供了对JDBC4.0 API的支持。它包括JDBC4.0驱动程序的所有特性以及JDBC4.0 API方法。不支持JDBC 4.1(将引发异常“SQLFeaturenotSupportedException”)。 因此,已经在java中运行的JDBC API将正常工作。 但是,Microsoft ODBC驱动程

  • 我正在学习SeleniumWebDriver,在成功使用firefox之后,现在我想尝试启动Chrome。所以我设置了它的驱动程序 但是当代码流到达驱动程序时。get()指令我收到此异常: 并显示此页面: “只允许本地连接”是什么意思?如何修复?

  • 我需要你的帮助:我必须读卡与RFID阅读器,在我的java应用程序。最后,当我点击按钮“Attributer Numéro RFID”时,它会读取我的RFID阅读器(型号:OCS ACRurw),然后将十六进制值插入jtextfield文本区域。(一开始,jTable会得到我数据库中每个用户的姓和名。这是我项目的代码。如果有人知道我点击“Attributer Numéro RFID”按钮时如何读取

  • 我试图让“更改订阅”使用Android的驱动器API工作,但到目前为止还没有成功。 null 有人知道这个问题的解决方案吗,或者能指出我做错了什么吗? 我编写了一些简单的testcode(见下文),它只需要连接的,下面是我测试的内容: 1. 3. 如果我通过testFileUpdate用一些新数据更新文件,我会在上得到以下结果: 和:

  • 我正试图使用IntelliJ IDE从Spark连接到老虎机数据库。有人能帮助jdbc驱动程序(。jar)文件吗?我正在寻找“com.tigergraph.jdbc.驱动程序”。 我确实找到了下面的gitHub存储库,其中包含了所有必需的信息。java文件。但是,我不知道如何在我的spark项目中使用它。https://github.com/tigergraph/ecosys/tree/maste

  • 有一个问题,它不隐藏浏览器,我能做什么?