使用Spark读取MS SQL Server表时遇ClassCastException如何解决?
解决Spark读取SQL Server时的ClassCastException异常
这个错误java.lang.ClassCastException: org.apache.spark.sql.ColumnName cannot be cast to java.lang.String其实很典型,问题出在你调用spark.read.jdbc时传入的第二个参数myTable类型不对。
错误根源
spark.read.jdbc()方法的第二个参数要求是字符串类型的表名,但你的myTable变量实际是org.apache.spark.sql.ColumnName类型——大概率是你不小心用了col()函数生成了Column对象,或是误定义了同名的Column类型变量,导致Spark在处理连接属性时试图把这个Column对象转成String,直接触发了类型转换异常。
具体解决步骤
你只需要确保传入的表名是字符串类型即可,推荐这几种修改方式:
直接传入表名字面量
把代码里的myTable替换成实际的表名字符串,比如:val stg = spark.read.jdbc(jdbcUrl, "your_real_table_name", connectionProperties)修正
myTable变量定义
检查你之前对myTable的定义,如果是类似下面的错误写法:// 错误写法:用col()生成了Column对象 val myTable = col("your_table_name")改成字符串类型的正确定义:
// 正确写法:定义为字符串 val myTable = "your_table_name"排查变量名冲突
如果你的代码里之前已经定义过同名的Column类型变量,建议重命名其中一个,避免变量名混淆导致的类型错误。
验证修改
完成修改后重新执行spark.read.jdbc语句,应该就能正常读取SQL Server中的目标表了。
内容的提问来源于stack exchange,提问作者Raviv
相关产品推荐
相关产品推荐

