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

Dataproc集群Spark作业读取Spanner表返回空DataFrame问题

解决Spark读取GCP Spanner数据仅返回列名无数据的问题(原生方式)

你当前用的是JDBC方式连接Spanner,而要实现Spark原生集成,应该使用Google Cloud Spanner Spark Connector——这是官方专为Spark打造的适配工具,能避免JDBC兼容性带来的隐性问题,更适合Spark分布式作业场景。

步骤1:替换依赖

把pom.xml里的google-cloud-spanner-jdbc依赖替换为Spark Connector依赖,注意匹配你的Spark版本(比如Spark 3.3+可使用如下版本):

<dependency>
    <groupId>com.google.cloud.spark</groupId>
    <artifactId>spark-spanner_2.12</artifactId>
    <version>2.14.0</version>
</dependency>

步骤2:确认权限

确保Dataproc集群的服务账号拥有Spanner数据库的读取权限,给账号分配roles/spanner.databaseReader角色即可。

步骤3:原生方式读取数据的代码示例

读取整张表

import com.google.cloud.spark.spanner._

val spannerConfig = Map(
  "projectId" -> projectId,
  "instanceId" -> instanceId,
  "databaseId" -> databaseId
)

val df = spark.read
  .format("spanner")
  .options(spannerConfig)
  .option("table", "emp")
  .load()

df.show()

执行自定义查询

import com.google.cloud.spark.spanner._

val spannerConfig = Map(
  "projectId" -> projectId,
  "instanceId" -> instanceId,
  "databaseId" -> databaseId
)

val df = spark.read
  .format("spanner")
  .options(spannerConfig)
  .option("query", "SELECT * FROM emp")
  .load()

df.show()

补充说明

你之前用JDBC方式返回空数据,大概率是Spark JDBC与Spanner驱动的兼容性问题(比如默认分区策略、fetch size设置不匹配),而原生Connector针对Spark的分布式特性做了优化,能直接规避这类问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:32:36