简单来说,我会使用给定名称创建仅提供数据的表。
我有一些JUnit带有样本数据(jsons)
我必须为上述文件提供架构以便为它们创建表格
我认为不需要提供上述模式。
为什么?因为在BigQuery控制台中我可以从查询创建表(甚至像select 1, 'test'
这样简单),或者我可以上传json来创建具有模式自动检测的表=>也许也可以以编程方式做到这一点
我看到https://chartio.com/resources/tutorials/how-to-create-a-table-from-a-query-in-google-bigquery/#using-the-api并且知道可以使用数据解析jsons到查询并使用Jobs.insert API来运行它们但是它过度设计并且还有一些其他不利因素,例如样板代码。
经过一些研究后,我发现可能更简单的方法在飞行中创建表格,但它对我不起作用,代码如下:
Insert insert = bigquery.jobs().insert(projectId,
new Job().setConfiguration(
new JobConfiguration().setLoad(
new JobConfigurationLoad()
.setSourceFormat("NEWLINE_DELIMITED_JSON")
.setDestinationTable(
new TableReference()
.setProjectId(projectId)
.setDatasetId(dataSetId)
.setTableId(tableId)
)
.setCreateDisposition("CREATE_IF_NEEDED")
.setWriteDisposition(writeDisposition)
.setSourceUris(Collections.singletonList(sourceUri))
.setAutodetect(true)
)
));
Job myInsertJob = insert.execute();
sourceUri指向用作源数据的JSON文件,如下所示:
[
{
"stringField1": "value1",
"numberField2": "123456789"
}
]
即使我使用setCreateDisposition("CREATE_IF_NEEDED")
,我仍然会收到错误:“找不到:表......”
API中是否有其他方法或更好的方法来排除架构?
答案 0 :(得分:0)
你问题中的代码非常好,如果它不存在,它会创建表格。但是,当您使用分区ID代替表ID时,即当您在作业中使用的目标表ID为"table$20170323"
时,它会失败。要写入分区,您必须先创建表。