我使用以下命令在sql中创建了一个表:
CREATE TABLE [dbo].[Validation](
[RuleId] [int] IDENTITY(1,1) NOT NULL,
[AppId] [varchar](255) NOT NULL,
[Date] [date] NOT NULL,
[RuleName] [varchar](255) NOT NULL,
[Value] [nvarchar](4000) NOT NULL
)
注意标识键(ruleid)
在sql中将值插入到表中时,如下所示:
注意:如果表为空并递增,不按原样插入主键将自动填充
INSERT INTO dbo.Validation VALUES ('TestApp','2020-05-15','MemoryUsageAnomaly','2300MB')
但是,当在databricks上创建临时表并执行下面相同的查询时,在pyspark上运行以下查询:
%python
driver = <Driver>
url = "jdbc:sqlserver:<URL>"
database = "<db>"
table = "dbo.Validation"
user = "<user>"
password = "<pass>"
#import the data
remote_table = spark.read.format("jdbc")\
.option("driver", driver)\
.option("url", url)\
.option("database", database)\
.option("dbtable", table)\
.option("user", user)\
.option("password", password)\
.load()
remote_table.createOrReplaceTempView("YOUR_TEMP_VIEW_NAMES")
sqlcontext.sql("INSERT INTO YOUR_TEMP_VIEW_NAMES VALUES ('TestApp','2020-05-15','MemoryUsageAnomaly','2300MB')")
我得到以下错误:
analysisexception:“未知”要求要插入的数据具有与目标表相同的列数:目标表有5列,但插入的数据有4列,包括0个具有常量值的分区列。;”
为什么它在sql上工作,而在通过databricks传递查询时却不工作?如何通过pyspark插入而不出现此错误?
1条答案
按热度按时间iaqfqrcu1#
这里最简单的解决方案是使用scala单元中的jdbc。如
您也可以使用pyodbc,但是默认情况下不安装sqlserverodbc驱动程序,而安装jdbc驱动程序。
spark解决方案是在sqlserver中创建一个视图,并插入该视图。如
然后
如果要封装scala并从另一种语言(如python)调用它,可以使用scala包单元。
如
然后你可以这样称呼它: