从Azure Synapse Notebook写入Kusto时表已存在触发类型转换异常
Azure Synapse PySpark写入Kusto时表已存在抛出ClassCastException的解决方法
问题场景
在Azure Synapse Notebook中使用PySpark向Kusto写入数据,当目标表已存在时,执行以下代码会抛出类型转换异常:
原代码
df.write \ .format("com.microsoft.kusto.spark.synapse.datasource") \ .option("spark.synapse.linkedService", "<link service name>") \ .option("kustoDatabase", "<Database name>") \ .option("kustoTable", "<Table name>") \ .option("tableCreateOptions","CreateIfNotExist") \ .mode("Append") \ .save()
抛出的异常
java.lang.ClassCastException: java.lang.String cannot be cast to org.json.JSONObject at com.microsoft.kusto.spark.datasink.KustoWriter$.$anonfun$write$3(KustoWriter.scala:69) at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286) at scala.collection.Iterator.foreach(Iterator.scala:943) at scala.collection.Iterator.foreach$(Iterator.scala:943) at scala.collection.AbstractIterator.foreach(Iterator.scala:1431) at scala.collection.IterableLike.foreach(IterableLike.scala:74) at scala.collection.IterableLike.foreach$(IterableLike.scala:73)
环境信息
当前Synapse池版本:Spark 3.3、Python 3.10、Scala 2.12.17、Java 11
问题原因
tableCreateOptions参数要求传入JSON格式字符串,原代码中直接传入"CreateIfNotExist"字符串,导致Kusto Spark连接器无法将其解析为预期的JSONObject,触发类型转换异常。
解决方案
方案1:修正tableCreateOptions参数格式
将参数值改为JSON格式的字符串,明确指定CreateIfNotExist为true:
df.write \ .format("com.microsoft.kusto.spark.synapse.datasource") \ .option("spark.synapse.linkedService", "<link service name>") \ .option("kustoDatabase", "<Database name>") \ .option("kustoTable", "<Table name>") \ .option("tableCreateOptions", '{"CreateIfNotExist": true}') \ .mode("Append") \ .save()
方案2:移除不必要的表创建参数
如果已经确认目标表存在,无需自动创建表逻辑,可直接删除tableCreateOptions参数,仅保留追加模式:
df.write \ .format("com.microsoft.kusto.spark.synapse.datasource") \ .option("spark.synapse.linkedService", "<link service name>") \ .option("kustoDatabase", "<Database name>") \ .option("kustoTable", "<Table name>") \ .mode("Append") \ .save()
内容的提问来源于stack exchange,提问作者DxG
相关产品推荐
相关产品推荐

