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
相关产品推荐
相关产品推荐

