【问题标题】:Query sql server table in azure databricks在 azure databricks 中查询 sql server 表
【发布时间】:2020-11-25 01:52:06
【问题描述】:

我正在使用下面的代码在我的 azure sql server 数据库中使用 azure databricks 查询一个 sql server 表 hr.employee。我是 spark sql 的新手,并尝试一步一步地学习细微差别。

Azure Databricks:

%scala
val jdbcHostname = dbutils.widgets.get("hostName")
val jdbcPort = 1433
val jdbcDatabase = dbutils.widgets.get("database")
val jdbcUrl = s"jdbc:sqlserver://${jdbcHostname}:${jdbcPort};database=${jdbcDatabase}"

import java.util.Properties
val connectionProperties = new Properties()
 
connectionProperties.put("user", s"${jdbcUsername}")
connectionProperties.put("password", s"${jdbcPassword}")

%scala
val driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
connectionProperties.setProperty("Driver", driverClass)

%scala
val employee = spark.read.jdbc(jdbcUrl, "hr.Employee", connectionProperties)

%scala
spark.sql("select * from employee") 

%sql
select * from employee

employee.select("col1","col2").show()

我收到以下错误。不知道我在做什么错。也尝试了几种变体,但到目前为止都没有运气。

错误:

';' expected but integer literal found.

command-922779590419509:26: error: not found: value %
%sql

command-922779590419509:27: error: not found: value select
select * from employee

command-922779590419509:27: error: not found: value from
select * from employee

command-922779590419509:16: error: not found: value %
%scala

【问题讨论】:

  • 使用spark.sql(query)?
  • 嗨@Lamanus,我试过 spark.sql(select * from ommp) 并得到错误。 command-922779590419509:26: error: not found: value select spark.sql(select * from ommp) command-922779590419509:26: error: not found: value from spark.sql(select * 来自 ommp) command-922779590419509:16:错误:未找到:值 % %scala
  • 不,应该是字符串,%scala spark.sql("select * from employee")
  • 嗨@Lamanus 尝试使用%scala 并得到相同的错误。
  • val dataDF = { val query = "select * from hr.Employee" sqlContext.sql(query) }; 这也不行。

标签: apache-spark-sql azure-databricks


【解决方案1】:

您可以查看以下步骤以使用其 JDBC 驱动程序查询 SQL Server:

注意:对于整个教程,我使用“Scala”源代码。

第 1 步:检查 JDBC 驱动程序是否可用

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")

第 2 步:创建 JDBC URL

val jdbcHostname = "<hostname>"
val jdbcPort = 1433
val jdbcDatabase = "<database>"

// Create the JDBC URL without passing in the user and password parameters.
val jdbcUrl = s"jdbc:sqlserver://${jdbcHostname}:${jdbcPort};database=${jdbcDatabase}"

// Create a Properties() object to hold the parameters.
import java.util.Properties
val connectionProperties = new Properties()

connectionProperties.put("user", s"${jdbcUsername}")
connectionProperties.put("password", s"${jdbcPassword}")

第 3 步:检查与 SQLServer 数据库的连接

val driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
connectionProperties.setProperty("Driver", driverClass)

第四步:从JDBC读取数据

val employees_table = spark.read.jdbc(jdbcUrl, "employees", connectionProperties)

Step5:从数据库表中读取架构

employees_table.printSchema

第 6 步:您可以针对此 JDBC 表运行查询:

display(employees_table.select("age", "salary").groupBy("age").avg("salary"))

截图如下:

=======> 更新答案

使用 SQL 查询:

第 1 步:在 Python 或 Scala 中从 DataFrame 创建全局表:

dataFrame.write.saveAsTable("<table-name>")

** Step2:** 现在运行 SQL 查询

spark.sql("select * from employees_table")

%sql 

select * from employees_table

【讨论】:

  • 嗨@CHEEKATLAPRADEEP-MSFT,非常感谢您的回复。您的解决方案有效。你能指出我对%scala spark.sql("select * from employee") 做错了什么吗?
  • 如果要使用SQL查询,需要先将表保存到默认数据库,然后运行查询。请检查更新的答案。
猜你喜欢
  • 2021-12-28
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多