在Databricks R Notebook中用SparkR创建SQL Server表报错求助
解决SparkR在SQL Server中创建表的问题
错误原因
你用SparkR::read.jdbc执行CREATE TABLE语句是错误的,因为:
read.jdbc的设计目的是读取返回结果集的SQL查询(比如SELECT语句),DDL语句(如CREATE TABLE)不会返回结果集,不符合该函数的使用场景。- 把
CREATE TABLE包裹在(...) as result的语法本身就不合法,SQL Server不允许在子查询中使用CREATE TABLE。
两种可行解决方案
方案一:通过SparkR写入空DataFrame创建表
如果要创建指定结构的空表,可以先构建对应Schema的空DataFrame,再通过write.jdbc写入SQL Server:
library(SparkR) library(magrittr) # 定义连接字符串 conn <- "jdbc:sqlserver://someconnection.windows.net:1433;database=some_db;user=user_name;password=user_password" # 定义表结构Schema table_schema <- structType( structField("PersonID", "integer"), structField("LastName", "string") ) # 创建空DataFrame empty_df <- createDataFrame(data.frame(), table_schema) # 写入SQL Server,mode="ignore"表示表已存在时不做操作,也可以用"overwrite"覆盖原有表 write.jdbc(empty_df, url = conn, table = "TableA", mode = "ignore")
方案二:直接执行DDL语句(用DBI包)
如果需要直接执行DDL命令,可以使用R的DBI包配合SQL Server JDBC驱动,这种方式更灵活,适合执行各类SQL语句:
library(DBI) # 定义连接参数 conn_url <- "jdbc:sqlserver://someconnection.windows.net:1433;database=some_db" user <- "user_name" password <- "user_password" driver <- "com.microsoft.sqlserver.jdbc.SQLServerDriver" # 建立JDBC连接 db_conn <- dbConnect(JDBC(driver, conn_url), user = user, password = password) # 执行CREATE TABLE语句 dbSendQuery(db_conn, "CREATE TABLE TableA (PersonID int, LastName varchar(255))") # 关闭连接 dbDisconnect(db_conn)
注:Databricks环境通常已预装SQL Server JDBC驱动,无需手动添加驱动包。
内容的提问来源于stack exchange,提问作者user1700890
相关产品推荐
相关产品推荐

