ОШИБКА : Параметр 64 («»): Указанное значение не является допустимым экземпляром типа данных float. Даже несмотря на то, что все поля моей схемы являются переменными

#java #sql-server #apache-spark

Вопрос:

схема таблицы sql server

Когда я загружаю данные из excel на MS sql-сервер с помощью spark,и хотя все мои поля имеют тип varchar в таблице sql server, я получаю это нарушение. Я не знаю, как преодолеть это с помощью java-кода.

 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262)  at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1632)  at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatementBatch(SQLServerPreparedStatement.java:2814)  at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtBatchExecCmd.doExecute(SQLServerPreparedStatement.java:2678)  at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7375)  at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3206)  at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:247)  at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:222)  at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeBatch(SQLServerPreparedStatement.java:2079)  at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.savePartition(JdbcUtils.scala:686)  at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.$anonfun$saveTable$1(JdbcUtils.scala:858)  at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.$anonfun$saveTable$1$adapted(JdbcUtils.scala:856)  at org.apache.spark.rdd.RDD.$anonfun$foreachPartition$2(RDD.scala:994)  at org.apache.spark.rdd.RDD.$anonfun$foreachPartition$2$adapted(RDD.scala:994)  at org.apache.spark.SparkContext.$anonfun$runJob$5(SparkContext.scala:2133)  at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)  at org.apache.spark.scheduler.Task.run(Task.scala:127)  at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:444)  at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1377)  at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:447)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)  at java.lang.Thread.run(Thread.java:748) [task-result-getter-3] WARN org.apache.spark.scheduler.TaskSetManager - Lost task 2.0 in stage 5.0 (TID 19, 192.168.0.103, executor driver): com.microsoft.sqlserver.jdbc.SQLServerException: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 64 (""): The supplied value is not a valid instance of data type float. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision.  at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262)  at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1632)  at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatementBatch(SQLServerPreparedStatement.java:2814)  at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtBatchExecCmd.doExecute(SQLServerPreparedStatement.java:2678)  at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7375)  at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3206)  at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:247)  at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:222)  at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeBatch(SQLServerPreparedStatement.java:2079)  at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.savePartition(JdbcUtils.scala:686)  at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.$anonfun$saveTable$1(JdbcUtils.scala:858)  at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.$anonfun$saveTable$1$adapted(JdbcUtils.scala:856)  at org.apache.spark.rdd.RDD.$anonfun$foreachPartition$2(RDD.scala:994)  at org.apache.spark.rdd.RDD.$anonfun$foreachPartition$2$adapted(RDD.scala:994)  at org.apache.spark.SparkContext.$anonfun$runJob$5(SparkContext.scala:2133)  at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)  at org.apache.spark.scheduler.Task.run(Task.scala:127)  at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:444)  at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1377)  at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:447)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)  at java.lang.Thread.run(Thread.java:748)  

Комментарии:

1. параметр 64 — это страшно

2. Проверьте схему целевой таблицы еще раз, сообщение об ошибке кажется довольно понятным: Parameter 64 (""): The supplied value is not a valid instance of data type float. Check the source data for invalid values. либо вы выбираете неправильное значение для отправки в float столбце, либо вам нужно отправить null вместо него.

3. Я только что добавил схему таблицы на изображение, не могли бы вы, пожалуйста, проверить это и сказать мне, что я делаю не так. потому что в схеме нет поля типа float(у меня есть только varchar(max)).

4. Вы не показываете 64-е поле

5. Похоже, в вашем коде есть ошибка, и никто не может помочь вам решить ее, не увидев ваш код. Кроме того, размещение изображений настоятельно не рекомендуется по многим причинам. Хуже того, ваше изображение-это просто список чисел и частичных типов данных (в лучшем случае) без какого-либо контекста. Ваш вопрос, скорее всего, будет закрыт, если вы не сможете предоставить полезную информацию о своей проблеме надлежащим образом.