如何在Dataproc的PySpark中跨GCP项目访问BigQuery数据集
我在Google Cloud中使用Python操作BigQuery、Dataproc、Workflows和Cloud Storage,目前拥有两个GCP项目:
- gcp-project1:包含BigQuery数据集
gcp-project1.my_dataset.my_table - gcp-project2:存放我的
myscript.py脚本及存储在Cloud Storage中的文件
我需要在myscript.py中,从Cloud Storage存储的文件(路径gs://path/bq.sql)读取SQL查询语句,查询gcp-project1中的BigQuery数据集。根据Spark-BigQuery连接器的要求,使用SQL查询读取BigQuery数据时,必须设置viewsEnabled=true和materializationDataset=dataset属性。
我尝试了以下几种配置方法,均以失败告终:
测试1
spark.conf.set("viewsEnabled", "true") spark.conf.set("materializationDataset", "my_dataset")
错误信息:Not found: Dataset gcp-project2:my_dataset was not found in location...
原因:脚本在gcp-project2中运行,连接器默认在当前项目(gcp-project2)中查找my_dataset,但目标数据集实际在gcp-project1中。
测试2
spark.conf.set("viewsEnabled", "true") spark.conf.set("materializationDataset", "gcp-project1.my_dataset")
错误信息:Dataset IDs must be alphanumeric (plus underscores) and must be at most 1024 characters long.
原因:直接将项目ID和数据集ID拼接作为materializationDataset的值,不符合数据集ID的格式要求。
测试3
spark.conf.set("viewsEnabled", "true") spark.conf.set("materializationDataset", "my_dataset") try: df = spark.read.format('bigquery') \ .option('project', 'gcp-project1') \ # 指定数据集所在的项目gcp-project1 .option('query', query1) \ .load() df.printSchema() df.show(10) except Exception as e: logger.error(f"Failed to read data from BigQuery: {e}") sys.exit(1)
错误信息:Not found: Dataset gcp-project2:my_dataset was not found in location...
原因:即使指定了project参数,连接器仍在当前项目(gcp-project2)中查找materializationDataset对应的数据集。
问题
如何配置我的PySpark脚本,使其在gcp-project2中运行时,能够成功读取gcp-project1中的BigQuery数据集?欢迎提供任何跨GCP项目交互数据集的实用建议。
内容的提问来源于stack exchange,提问作者Henry Xiloj Herrera

