如何通过 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 中创建没有架构的表?的主要内容,如果未能解决你的问题,请参考以下文章
Bigquery Python API 按特定字段创建分区表
Google Bigquery API:如何将结果查询添加到表中?
使用应用程序脚本在 Big Query 中创建视图 |错误:对 bigquery.tables.insert 的 API 调用失败并出现错误:缺少必需的参数(第 21 行