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表的真实数据为:
| name | address | |
|---|---|---|
| devendra | dev2311999@gmail.com | bhopal |
解决方法
出现这种情况通常是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
相关产品推荐
相关产品推荐

