如何通过 API 在 BigQuery 中创建没有架构的表?

Posted

技术标签:

【中文标题】如何通过 API 在 BigQuery 中创建没有架构的表?【英文标题】:How to create table without schema in BigQuery by API? 【发布时间】:2017-03-21 08:28:59 【问题描述】:

简单地说,我将创建具有给定名称的表,仅提供数据。

我有一些带有示例数据 (jsons) 的 JUnit

必须为上述文件提供架构以便为它们创建表

我想不需要提供上述架构。 为什么?因为在 BigQuery 控制台中,我可以从查询创建表(即使是这样简单的:select 1, 'test')或者我可以上传 json 以创建具有模式自动检测的表 => 可能也可以通过编程方式完成

我看到 https://chartio.com/resources/tutorials/how-to-create-a-table-from-a-query-in-google-bigquery/#using-the-api 并且知道它可以解析带有数据的 json 以进行查询并使用 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();

作为源数据的JSON文件由sourceUri指向,如下所示:

[
  
    "stringField1": "value1",
    "numberField2": "123456789"
  
]

即使我使用了setCreateDisposition("CREATE_IF_NEEDED"),我仍然收到错误:“未找到:表...”

API 中是否有其他方法或比上述更好的方法来排除架构?

【问题讨论】:

从您的问题中不清楚您的输入数据是什么形式的。您提供了可以创建表的查询示例和具有自动检测功能的 JSON。但是你的数据是什么样子的呢? @MoshaPasumansky 我已经编辑了我的问题。我不确定,但假设“CREATE_IF_NEEDED”仅适用于提供的查询...... 您的代码对我来说看起来不错 - 您能否分享失败的作业 ID,也许我可以从那里找到错误的原因。 @MoshaPasumansky 工作 id 从今天重新运行:job_AClL7HwuH3vaXbXwVjqTlvRzLcM 【参考方案1】:

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

【讨论】:

谢谢,原来如此。

以上是关于如何通过 API 在 BigQuery 中创建没有架构的表?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 java 在 BigQuery 中创建分区表?

如何在BigQuery中创建嵌套字段和数组的数组

Bigquery Python API 按特定字段创建分区表

查找在 BigQuery 中创建表的查询

Google Bigquery API:如何将结果查询添加到表中?

使用应用程序脚本在 Big Query 中创建视图 |错误:对 bigquery.tables.insert 的 API 调用失败并出现错误:缺少必需的参数(第 21 行