Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 我可以将json文件从Project_a推送/加载到Project_B的BigQuery吗?i、 e.整个项目_Google Cloud Platform_Google Bigquery_Google Cloud Functions - Fatal编程技术网

Google cloud platform 我可以将json文件从Project_a推送/加载到Project_B的BigQuery吗?i、 e.整个项目

Google cloud platform 我可以将json文件从Project_a推送/加载到Project_B的BigQuery吗?i、 e.整个项目,google-cloud-platform,google-bigquery,google-cloud-functions,Google Cloud Platform,Google Bigquery,Google Cloud Functions,我可以将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&q

我可以将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) 
现在,当我在项目A中运行它时,CloudFunction开始抛出错误,因为它找不到项目B的表ref(因为它在项目A中搜索)

此外,我还尝试使用服务凭据,例如,使用os.environ['GOOGLE_APPLICATION_Credentials']=Proj_A中的Proj_B_key_文件设置项目的服务凭据,但不知何故,这并没有帮助。 有什么想法吗


用例:我有一些服务,它们可以做一些工作,例如从一堆平台中提取数据,然后根据需要将数据填充回客户机的BigQuery表。

我建议您看看这里,这里解释了如何跨项目复制数据集,如前所述:

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

只考虑对该动作有适当的权限:

  • bigquery.transfers.update权限创建副本传输
  • 源数据集上的bigquery.tables.list权限
此外,您还可以找到如何执行此任务的不同示例,例如使用命令:

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

这比我想象的要容易。 只要把auth弄得一团糟就行了。 例如,在项目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不会在当前项目中搜索数据集,而是在作为param传递的项目中搜索数据集。请记住在Proj_B中为服务帐户BigQuery jobs create和editor提供访问权限,以允许其写入数据。

您的流程的真正目的是什么?我这样问是因为你可能在尝试一些低效的东西,我想确保为你提供正确的见解。作为一个快速的回答,你不需要把项目B中的专用密钥文件作为函数的标识。而是在项目B的IAM权限中向您的云功能声明关联的服务帐户,并对其设置正确的权限。{bigquery.tables.create,bigquery.tables.updateData,bigquery.jobs.create}。参照应遵循模式;PROJECT_ID:DATASET.table感谢@chaiyachaiya的响应-添加了用例。如果它能工作,对你有好处,但我一直认为它有点奇怪。您不需要从项目B创建密钥文件,这样项目a中的流程就好像它属于项目B一样,因此在项目B中查找表(默认情况下)。我的建议。保留云功能的默认标识,并在项目B的IAM中声明具有所需权限的关联服务帐户。在最初的问题中,您可能还拼错了需要项目ID:TableReference.from_string('my-project.mydataset.mytable')的表ref。此外,您还应该在流中添加一个中间步骤,即将原始数据放在datalake中。如果需要重播数据,该怎么办?当您决定删除时,它可能已从源URI中消失。GCS是一个很好的位置,可以从低存储价格和到BigQuery的高传输性能中获益。通过将云函数附加到GCS中的文件创建事件,可以自动完成传输。