2013-09-30 61 views
1

我想用這個例子的代碼中插入一行:的BigQuery:無效的表ID

https://developers.google.com/bigquery/streaming-data-into-bigquery#streaminginsertexamples

我收到一個錯誤:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 
{ 
    "code" : 400, 
    "errors" : [ { 
    "domain" : "global", 
    "message" : "Invalid table ID \"projectid:datasetid.tableid\".", 
    "reason" : "invalid" 
    } ], 
    "message" : "Invalid table ID \"projectid:datasetid.tableid\"." 
} 

項目,數據集和表都存在。當我從錯誤報告中複製實際projectid:datasetid.tableid並將其粘貼到BigQuery Web UI中時,它可以正常工作。投影中有一個' - ',其餘的是字母數字。爲什麼API會抱怨Web UI接受的ID?


更新回答Jordan的問題。這是我的電話:

TableDataInsertAllResponse response = 
    bigquery 
    .tabledata() 
    .insertAll(projectId, datasetId, table.getId(), content) 
    .execute(); 

在我調用這個之前,我通過獲取它們來確保項目,數據集和表格都存在。然後我使用表的實際ID。


新的信息:原來(當你懷疑)的table.getId()返回完全合格的ID,包括項目和數據集。當我對縮短的ID進行硬編碼以排除它們時,它就起作用了。

+0

這聽起來像你發送一個名稱作爲表名稱,而不是將它分成組件。如果情況並非如此,您可以發送您打給您的實際代碼嗎? –

+0

嗨,喬丹。更新。 (順便說一句,謝謝你們加入SO的努力。) –

回答

4

啊哈...好吧這是預期的。 table.getId()調用將返回表的全限定名稱(即project:dataset.table)。 (見https://developers.google.com/bigquery/docs/reference/v2/tables)。

嘗試用table.getTableReference().getTableId()代替。 (見https://developers.google.com/resources/api-libraries/documentation/bigquery/v2/java/latest/com/google/api/services/bigquery/model/Table.html#getTableReference()

爲什麼,你可能會問?每個REST資源都應該有一個唯一的ID。該表的完全限定的唯一ID是project:dataset.table名稱。但是,當傳遞id的組件時,表組件只是該名稱的最後一部分。