首页 > 解决方案 > 将名为整数的 mssql 表导入 spark 数据帧时出错

问题描述

我在 MSSQL 中有一个名为 dbo.1table 的表,我需要将其转换为数据框,然后将其保存为 avro 文件,但我什至无法将其加载为数据框。

我用以字符 az 命名的表测试了我的代码,它可以工作,我尝试将表名转换为“toString()”,但到目前为止没有任何效果。我希望有一个数据框,然后将其保存为 avro 文件。相反,我有以下错误:

val DFDimAccountOperator = spark.read.format("jdbc")
   .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
   .option("url", connection)
   .option("dbtable", "dbo.1table")
   .option("user", userId)
   .option("password", pwd).load() 
   DFDimAccountOperator.write.format("avro").save("conversionTypes/testinAVro13")

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '.1'.    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262)
   at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1621)
   at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:592)
   at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:522)
   at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7194)
   at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2935)
   at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:248)
   at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:223)
   at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:444)
   at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:61)
   at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation$.getSchema(JDBCRelation.scala:210)
   at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:35)
   at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:318)
   at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:223)
   at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:211)
   at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:167)
   at com.aon.ukbi.TomsExample$.runJdbcDatasetExample(TomsExample.scala:27)
   at com.aon.ukbi.TomsExample$.main(TomsExample.scala:16)

标签: scalaapache-sparkapache-spark-sql

解决方案


联系

要在 MSSQL 和 Spark 之间建立连接,您需要将sqljdbc jar 添加到 $SPARK_HOME/jars 位置并重新启动 spark-shell 并将这些行粘贴到 Spark Shell 中。

scala> val DFDimAccountOperator = spark.read.format("jdbc").option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")   .option("url", "jdbc:sqlserver://xxxxxxxx.xxx:1433;database=xx;user=xxxxxx;password=xxxxxx") .option("dbtable", "xxxxxx").load()

重新启动并重新运行代码(将 XXXX 替换为适当的值)

在此之后,您可以编写您想要的任何格式的数据框。

DFDimAccountOperator.write.format("avro").save("conversionTypes/testinAVro13")

希望这可以帮助您让我知道您是否有与此相关的进一步疑问,如果它解决了您的目的,请接受答案 HAppy HAdooop


推荐阅读