我正在尝试使用 java 代码连接到 databricks。有人能帮助我吗?这是到目前为止我得到的代码::
打包 digital.eComm.ui.tests;
导入java.sql.Connection; 导入 java.sql.DriverManager; 导入java.sql.SQLException; 导入 java.util.Properties;
public class DatabricksSetup {
public static void main(String[] args) throws SQLException {
String url = "jdbc:databricks://XXXX.azuredatabricks.net:443/default;transportMode=http;ssl=1;httpPath=sql/protocolv1/o/XXXXX;AuthMech=3;UID=token;PWD=XXXXXX";
String username = "token";
String password = "XXXX"; //Token generated from databricks profile page.
Connection connection = DriverManager.getConnection(url, username, password);
System.out.println("Database connected!");
if(connection != null){
System.out.println("Connection Established");
}
else {
System.out.println("Connection Failed");
}
}
}
已添加以下依赖项:
"com.databricks:databricks-jdbc:2.6.25"
错误:
Exception in thread "main" java.sql.SQLException: [Databricks][DatabricksJDBCDriver](500593) Communication link failure. Failed to connect to server. Reason: HTTP Response code: 403, Error message: Unknown.
at com.databricks.client.hivecommon.api.HS2Client.handleTTransportException(Unknown Source)
at com.databricks.client.spark.jdbc.DowloadableFetchClient.handleTTransportException(Unknown Source)
at com.databricks.client.hivecommon.api.HS2Client.openSession(Unknown Source)
at com.databricks.client.hivecommon.api.HS2Client.<init>(Unknown Source)
at com.databricks.client.spark.jdbc.DowloadableFetchClient.<init>(Unknown Source)
at com.databricks.client.spark.jdbc.DownloadableFetchClientFactory.createClient(Unknown Source)
at com.databricks.client.hivecommon.core.HiveJDBCCommonConnection.connectToServer(Unknown Source)
at com.databricks.client.spark.core.SparkJDBCConnection.connectToServer(Unknown Source)
at com.databricks.client.hivecommon.core.HiveJDBCCommonConnection.establishConnection(Unknown Source)
at com.databricks.client.spark.core.SparkJDBCConnection.establishConnection(Unknown Source)
at com.databricks.client.jdbc.core.LoginTimeoutConnection.connect(Unknown Source)
at com.databricks.client.jdbc.common.BaseConnectionFactory.doConnect(Unknown Source)
at com.databricks.client.jdbc.common.AbstractDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at digital.eComm.ui.tests.DatabricksSetup.main(DatabricksSetup.java:16)
Caused by: com.databricks.client.support.exceptions.ErrorException: [Databricks][DatabricksJDBCDriver](500593) Communication link failure. Failed to connect to server. Reason: HTTP Response code: 403, Error message: Unknown.
... 16 more
403
是明确的拒绝。服务器告诉您:我知道您是谁,但您无法做您想做的事。
很可能是因为驱动程序尝试使用用户/密码机制来进行身份验证,而不是 URL 中的令牌,因为您显式地将参数传递给
getConnection()
。
将
DriverManager.getConnection(url, username, password);
替换为 DriverManager.getConnection(url);
并尝试。
Maven 上的 Databricks JDBC 驱动程序
Java 和 JVM 开发人员使用 JDBC 作为访问数据库的标准 API。 Databricks JDBC 驱动程序现已在 Maven 中央存储库上提供,让您可以在构建系统和 CI/CD 运行中使用此驱动程序。要将其包含在您的 Java 项目中,请将以下条目添加到您应用程序的
:pom.xml
<dependency> <groupid>com.databricks <artifactid>databricks-jdbc</artifactid> <version>2.6.25-1</version> </groupid></dependency>
这里是一些使用 JDBC 驱动程序查询数据的示例代码:
import java.sql.*; public static void main(String[] args) throws Exception { // Open a connection // replace the values below String token = "dapi*****"; String url = "jdbc:databricks://********.cloud.databricks.com:443/default;" + "transportMode=http;ssl=1;AuthMech=3;httpPath=sql/protocolv1/o/*****;" + "UID=token;" + "PWD=" + token; try (Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM samples.nyctaxi.trips");) { // Extract data from result set while (rs.next()) { // Retrieve by column name System.out.print("ID: " + rs.getString("col_name")); } } }
这里的响应有点晚了,但以防万一其他人在搜索此异常时得到此结果:
我遇到了同样的问题,使用与OP基本相同的代码来创建Connection对象(也在Databricks文档中引用):
Connection connection = DriverManager.getConnection(url, username, password);
更奇怪的是:当应用程序部署到 AKS 时,此代码可以工作,但在我的笔记本电脑本地运行时却不起作用。
我们的数据团队表示不存在会导致此行为的 IP 块,但建议我根据 此 Microsoft 文档重新实现。我重写了代码:
String url = "jdbc:databricks://<host>:443";
Properties p = new java.util.Properties();
p.put("httpPath", "<http-path>");
p.put("transportMode", "http");
p.put("ssl", "1");
p.put("UseNativeQuery", "1");
p.put("AuthMech", "3");
p.put("UID", "token");
p.put("PWD", "<pwd>");
Connection ods = DriverManager.getConnection(url, p);
现在连接已建立。顺便说一句,这是最新版本的 Databricks JDBC 驱动程序 (2.6.36)。