【问题标题】:Can I push/load a json file from Project_A to BigQuery of Project_B ? i.e. across the Projects我可以将 json 文件从 Project_A 推送/加载到 Project_B 的 BigQuery 吗?即跨项目
【发布时间】:2021-01-10 17:38:33
【问题描述】:

我可以将 json 文件从 Project_A 推送/加载到 Project_B 的 BigQuery 吗?如果是怎么办? 我试过的代码

 os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = key_file_of_proj_B
client = bigquery.Client() 
client.load_table_from_file(
        source_json_file,table_ref_of_proj_B,location="US",
        job_config=job_config) 

现在,当我在 project_A 中运行它时,CloudFunction 开始抛出错误,因为它找不到 table_ref_of_proj_B(因为它在 Proj A 中搜索)。

我还尝试过使用 Service_Credentials,例如在 Proj_A 中使用 os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = proj_B_key_file 设置 Proj_B 的服务凭据,但不知何故它没有帮助。 有什么想法吗?

用例:我有一些服务,例如从一堆平台中提取数据,然后根据需要将数据填充回客户端的 BigQuery 表中。

【问题讨论】:

  • 您的流程的真正目的是什么?我问它是因为您可能正在尝试一些低效的东西,我想确保为您提供正确的见解。
  • 作为一个快速答案,您不需要将项目 B 中的专用密钥文件作为函数的标识。而是在项目 B 的 IAM 权限中向您的云函数声明关联的服务帐户,并对其设置正确的权限。 {bigquery.tables.create,bigquery.tables.updateData,bigquery.jobs.create}。并且参考应该遵循模式; PROJECT_ID:DATASET.TABLE
  • 感谢@chaiyachaiya 的回复 - 添加了用例。

标签: google-cloud-platform google-bigquery google-cloud-functions


【解决方案1】:

我建议您看一下document,其中解释了如何跨项目复制数据集,如其中所述:

“您可以在一个区域内或从一个区域复制数据集到另一个区域,而无需将数据提取、移动和重新加载到 BigQuery 中。您可以复制数据集一次或按自定义的重复计划。”

只需考虑拥有此操作的适当权限即可:

  • 创建复制传输的 bigquery.transfers.update 权限。
  • 对源数据集的 bigquery.tables.list 权限。

此外,您还可以找到如何执行此任务的不同示例,例如使用bq 命令:

bq mk --transfer_config --project_id=PROJECT_ID --data_source=DATA_SOURCE --target_dataset=DATASET --display_name=NAME --params='PARAMETERS'

【讨论】:

    【解决方案2】:

    这比我想象的要容易。 只是弄乱了身份验证。 例如在 Proj_A 中,我会执行以下任一操作:

    bigquery.Client(project='Proj_B', credentials=credsobject_of_Proj_B)
    
    or
    # Don't pass the credentials and let it default to inferred from the environment
    os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = Key_File_Proj_B
    bigquery.Client(project='Proj_B')
    
    

    这样,BigQuery 不会在当前项目中搜索数据集,而是在作为参数传递的项目中搜索。请记住在 Proj_B 中授予服务帐号 BigQuery 作业创建和编辑权限,以允许其写入数据。

    【讨论】:

    • 如果它有效,对你有好处,但我一直认为这有点奇怪。您不需要从项目 B 创建密钥文件,因此您在项目 A 中的进程将表现得好像它属于项目 B 一样,因此会在项目 B 中查找表(默认情况下)。我的忠告。保留您的云功能的默认身份,并在项目 B 的 IAM 中声明关联的服务帐户具有所需的权限。在您最初的问题中,您可能还拼错了需要项目 ID 的表引用:TableReference.from_string('my-project.mydataset.mytable')。
    • 另外,您应该在流程中添加一个中间步骤,即将原始数据放在数据湖中。如果需要重放数据怎么办?当您决定这样做时,它可能已从源 URI 中消失。 GCS 是受益于低存储价格和高传输性能到 BigQuery 的好位置。通过将云功能附加到 GCS 中的文件创建事件,可以自动完成传输。
    猜你喜欢
    • 2016-08-12
    • 2020-09-22
    • 1970-01-01
    • 2021-10-24
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2020-03-29
    相关资源
    最近更新 更多