从AWS Glue的PySpark作业写入Databricks时JDBC报错求助
解决AWS Glue PySpark写入Databricks JDBC的列名引号问题
问题出在Spark JDBC writer默认会用双引号包裹列名,但Databricks的SQL解析器不认这种格式(它用反引号来处理特殊标识符)。给你三个可行的解决办法:
方法1:直接禁用标识符引号包裹
如果你的列名没有特殊字符(比如空格、SQL保留字),最简单的办法就是在JDBC写入选项里加quoteIdentifier并设为false,这样Spark就不会给列名加引号了:
spark_df.write.format("jdbc") \ .option("url", jdbc_url) \ .option("dbtable", table_name) \ .option("password", pwd) \ .option("quoteIdentifier", "false") \ .mode("overwrite") \ .save()
方法2:指定Databricks支持的引号字符
如果列名有特殊字符必须保留引号,那就把Spark默认的引号字符改成反引号,让生成的SQL符合Databricks规则。可以在创建SparkSession的时候配置:
spark = SparkSession.builder \ .appName("GlueToDatabricks") \ .config("spark.sql.identifier.quoteChar", "`") \ .getOrCreate() # 之后正常执行写入 spark_df.write.format("jdbc") \ .option("url", jdbc_url) \ .option("dbtable", table_name) \ .option("password", pwd) \ .mode("overwrite") \ .save()
方法3:改用Delta Lake直接写入(推荐)
如果你的Databricks集群用了Delta Lake,直接用Delta格式写入比JDBC高效得多,还能彻底避开这类SQL解析问题:
# 写入DBFS上的Delta表路径 spark_df.write.format("delta") \ .mode("overwrite") \ .save("dbfs:/path/to/your/delta/table") # 或者直接写入已注册的Delta表 spark_df.write.format("delta") \ .mode("overwrite") \ .saveAsTable("MYDATABASE.MYTABLE")
这种方式不需要依赖JDBC驱动,还能用到Delta的ACID、版本控制等特性。
内容的提问来源于stack exchange,提问作者Meyer Cohen
相关产品推荐
相关产品推荐

