如何在API中使用BigQuery创建没有架构的表?

时间:2017-03-21 08:28:59

标签: json google-bigquery

简单来说,我会使用给定名称创建仅提供数据的表。

我有一些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中是否有其他方法或更好的方法来排除架构?

1 个答案:

答案 0 :(得分:0)

你问题中的代码非常好,如果它不存在,它会创建表格。但是,当您使用分区ID代替表ID时,即当您在作业中使用的目标表ID为"table$20170323"时,它会失败。要写入分区,您必须先创建表。