在 Dataproc 上使用 PySpark 从不同的 GCP 项目访问 BigQuery 数据集

问题描述 投票:0回答:1

我正在使用 Python 在 Google Cloud 中使用 BigQuery、Dataproc、工作流和云存储。

我有两个 GCP 项目:

  • gcp-project1: 包含 BigQuery 数据集 gcp-project1.my_dataset.my_table

  • gcp-project2:包含我的myscript.py和我存储在云存储中的文件

myscript.py 中,我尝试从存储在 Cloud Storage (query1=gs://path/bq.sql) 中的文件读取 SQL 查询,并从 gcp-project1 中的 BigQuery 数据集查询数据.

根据文档here,当使用SQL查询从BigQuery读取时,我需要设置属性viewsEnabled=truematerializationDataset=dataset

以下是我尝试过的方法:

测试1:

spark.conf.set("viewsEnabled", "true")
spark.conf.set("materializationDataset", "my_dataset")

此操作失败,因为它在 gcp-project2 中搜索数据集(其中 myscript.py 正在运行),但我的数据集位于 gcp-project1 中。错误是:未找到:数据集 gcp-project2:在位置中找不到 my_dataset...

测试2:

spark.conf.set("viewsEnabled", "true")
spark.conf.set("materializationDataset", "gcp-project1.my_dataset")

此操作失败,并显示错误:数据集 ID 必须是字母数字(加下划线),并且长度不得超过 1024 个字符。

测试3:

spark.conf.set("viewsEnabled", "true")
spark.conf.set("materializationDataset", "my_dataset")

try:
    df = spark.read.format('bigquery') \
        .option('project', 'gcp-project1') \ #Adding gcp-project1 contains dataset
        .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)

这也会失败并出现相同的错误:未找到:数据集 gcp-project2:在位置中找不到 my_dataset...

问题:

如何配置 PySpark 脚本以在 gcp-project2 中运行脚本时从 gcp-project1 中的 BigQuery 数据集读取数据?

任何有关与不同 GCP 项目的数据集交互的建议将不胜感激。

提前致谢!

python apache-spark google-bigquery google-cloud-dataproc
1个回答
0
投票

// 阐述评论 如果该表存在并且在访问该表时我们会收到错误:

Not found: Dataset "project.dataset" was not found in location...
,那么它通常是由于数据集的权限问题而发生的。 只需几个步骤即可检查

  1. 运行 Dataproc 作业的服务帐户/用户应具有读取权限 BigQuery 数据集/表的权限。
  2. 确保数据集和 Dataproc 集群位于同一区域
© www.soinside.com 2019 - 2024. All rights reserved.