簡體   English   中英

從共享數據集中提取BigQuery數據

[英]Extracting BigQuery Data From a Shared Dataset

是否可以使用客戶端API(python)從共享數據集(我只有查看權限)中提取數據(到Google雲存儲)?

我可以使用網絡瀏覽器手動完成此操作,但無法使用API​​使其正常工作。

我已經創建了一個項目(MyProject)和一個服務帳戶,供MyProject使用API​​創建服務時用作憑據。 此帳戶對共享數據集(MySharedDataset)具有查看權限,並對我的Google雲存儲桶具有寫入權限。 如果我嘗試在自己的項目中運行作業以從共享項目中提取數據:

job_data = {
        'jobReference': {
            'projectId': myProjectId,
            'jobId': str(uuid.uuid4())
        },
        'configuration': {
            'extract': {
                'sourceTable': {
                    'projectId': sharedProjectId,
                    'datasetId': sharedDatasetId,
                    'tableId': sharedTableId,
                },
                'destinationUris': [cloud_storage_path],
                'destinationFormat': 'AVRO'
            }
        }
    }

我得到錯誤:

googleapiclient.errors.HttpError:https://www.googleapis.com/bigquery/v2/projects/sharedProjectId/jobs?alt=json返回“內容中的值“ myProjectId”與值sharedProjectId不一致。當通過參數設置的值與請求中設置的值不一致。“>

在jobReference和sourceTable中都使用sharedProjectId,我得到:

googleapiclient.errors.HttpError:https://www.googleapis.com/bigquery/v2/projects/sharedProjectId/jobs?alt=json返回“拒絕訪問:作業myJobId:用戶myServiceAccountEmail沒有權限在項目中運行作業sharedProjectId“>

將myProjectId用於這兩個作業將立即返回狀態為“ DONE”且沒有錯誤,但是沒有導出任何內容。 我的GCS存儲桶是空的。

如果使用API​​確實無法做到這一點,是否還有另一種方法/工具可用於自動從共享數據集中提取數據?

*更新*

使用在我的Google Analytics(分析)登錄名下運行的API資源管理器,這可以很好地工作。 在我的代碼中,我使用以下方法:

service.jobs().insert(projectId=myProjectId, body=job_data).execute()

並刪除了包含projectId的jobReference對象

job_data = {
        'configuration': {
            'extract': {
                'sourceTable': {
                    'projectId': sharedProjectId,
                    'datasetId': sharedDatasetId,
                    'tableId': sharedTableId,
                },
                'destinationUris': [cloud_storage_path],
                'destinationFormat': 'AVRO'
            }
        }
    }

但這會返回錯誤

拒絕訪問:表sharedProjectId:sharedDatasetId.sharedTableId:用戶'serviceAccountEmail'無權導出數據集sharedProjectId:sharedDatasetId中的表

我的服務帳戶現在是共享數據集的所有者,並且對MyProject擁有編輯權限,還需要在何處設置權限,或者是否可以使用我的GA登錄憑據而不是服務帳戶來使用python API?

*更新*

終於讓它工作了。 怎么樣? 確保服務帳戶具有查看數據集的權限(如果您無權自己檢查此數據集,並且有人告訴您可以這樣做,請要求他們仔細檢查/向您發送屏幕截圖!)

嘗試重現該問題后,我遇到了解析錯誤。 我做了過開發者控制台[2]上的API的試用,並且可以正常工作。 jobs.insert API 我注意到的是,下面的請求代碼與網站上的文檔格式不同,因為它具有單引號而不是雙引號。

這是我運行以使其工作的代碼。

{
'configuration': {
    'extract': {
        'sourceTable': {
            'projectId': "sharedProjectID",
            'datasetId': "sharedDataSetID",
            'tableId': "sharedTableID"
        },
        'destinationUri': "gs://myBucket/myFile.csv"
    }
}
}

HTTP請求

POST https://www.googleapis.com/bigquery/v2/projects/myProjectId/jobs

如果仍然遇到問題,可以嘗試在網站[2]上嘗試jobs.insert API或嘗試bq命令工具[3]。

以下命令可以執行相同的操作:

bq提取sharedProjectId:sharedDataSetId.sharedTableId gs://myBucket/myFile.csv

希望這可以幫助。

[2] https://cloud.google.com/bigquery/docs/reference/v2/jobs/insert

[3] https://cloud.google.com/bigquery/bq-command-line-tool

確保服務帳戶具有查看數據集的權限(如果您無權自己檢查此數據集,並且有人告訴您可以這樣做,請要求他們仔細檢查/向您發送屏幕截圖!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM