You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark读取Databricks数据时列名显示为值的问题求助

问题:Spark JDBC读取Databricks数据显示重复列名而非真实数据

我正在尝试从Databricks获取数据,使用Spark 3.3.1版本与DatabricksJDBC42.jar驱动。执行以下JDBC读取代码:

val query="SELECT * FROM test1"

val dataFrame = spark.read
  .format("jdbc")
  .option("url", url)
  .option("user", user)
  .option("password", password)
  .option("dbtable", s"""($query) t""")
  .load()

dataFrame.show()

但查询结果重复显示列名而非实际数据:

Output

+----+-----+-------+
|name|email|address|
+----+-----+-------+
|name|email|address|
|name|email|address|
+----+-----+-------+

数据库中test1表的真实数据为:

nameemailaddress
devendradev2311999@gmail.combhopal

解决方法

出现这种情况通常是JDBC驱动读取数据时误将数据行识别为表头,或驱动配置存在问题,可尝试以下方案:

  • 添加分区参数强制解析数据
    Databricks JDBC驱动处理无分区查询时易出现识别错误,添加分区参数可修正此问题:

    val dataFrame = spark.read
      .format("jdbc")
      .option("url", url)
      .option("user", user)
      .option("password", password)
      .option("dbtable", s"""($query) t""")
      .option("lowerBound", "1")
      .option("upperBound", "100")
      .option("numPartitions", "1")
      .load()
    
  • 直接指定表名而非子查询
    避免用子查询包装SQL,直接将dbtable设为目标表名:

    val dataFrame = spark.read
      .format("jdbc")
      .option("url", url)
      .option("user", user)
      .option("password", password)
      .option("dbtable", "test1")
      .load()
    
  • 明确指定驱动类
    确保Spark加载正确的Databricks JDBC驱动类:

    val dataFrame = spark.read
      .format("jdbc")
      .option("url", url)
      .option("driver", "com.databricks.client.jdbc.Driver")
      .option("user", user)
      .option("password", password)
      .option("dbtable", s"""($query) t""")
      .load()
    
  • 检查驱动版本兼容性
    确认DatabricksJDBC42.jar版本与Spark 3.3.1及目标Databricks集群版本匹配,建议使用对应集群版本的官方驱动。


内容的提问来源于stack exchange,提问作者Devendra Vishwakarma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:52:18