2017-01-23 55 views
0

我想流使用templateSuffix和使用Java API 附加到表名的日期分区数据到大的查询,但我得到以下异常:流数据到谷歌的BigQuery模板表日期分区

com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request 
{ 
"code" : 400, 
"errors" : [ { 
"domain" : "global", 
"location" : "suffix", 
"locationType" : "other", 
"message" : "Table name should only contain _, a-z, A-Z, or 0-9.", 
"reason" : "invalid" 
} ], 
"message" : "Table name should only contain _, a-z, A-Z, or 0-9." 
} 

我使用的API为:

String tableName = "testTable$201701"; // 201701 is partition_id 
TableDataInsertAllRequest request = new TableDataInsertAllRequest() 
        .setIgnoreUnknownValues(true) 
        .setRows(rows); 

// add a template suffix 
request.setTemplateSuffix(templateSuffix); 

return bigquery 
.tabledata() 
.insertAll(projectId, datasetId, tableName, request) 
.execute(); 

只有templateSuffix或放在桌子上只有日期分区工作正常。但不是两个在一起。任何想法如何解决这个问题?

回答

1

有两个独立的用例 - 流数据每天分片表数据和流数据,以每天分区表

日报date-sharded tables是那些有独立的表的每一天对day partitioned table这是一个表,但分区“内部“

你可以在任何这些流中。
对于流式发生 - 表必须存在。因此,为了避免为每一个新的一天创建新表 - 使用了template table(如果您有分区表,则不需要)。
因此,要么流式传输到日分区表的特定分区,要么使用模板表流式分隔日分区表。
不是两个在同一时间!

+0

那么,在我的情况下,我有日期分区表。但它超过了每秒100K的插入限制。 (我的速度约为每秒300K)那么,我有什么选择?这就是我试图创建多个模板表的原因。但由于明显的性能原因,我必须保留日期分区。 – figaro

+0

只是简单的选择:你可以让我们说10个表中的每一个表示模10,根据你的数据/环境有意义。所以你只需在你的代码中进行管理即可。例如,如果您有多台服务器从您流向BigQuery - 您可以对这些服务器进行模块化等。希望您有想法 –

+0

正确。但我希望使用模板表可以免除管理个人表格架构的开销。在这种情况下,我必须自己创建所有这10个具有相同模式的表。对? – figaro