如何在 bigquery 中使用 python 将数据添加到 RECORD 类型的列

Posted

技术标签:

【中文标题】如何在 bigquery 中使用 python 将数据添加到 RECORD 类型的列【英文标题】:How to add data to a RECORD type column using python in bigquery 【发布时间】:2016-10-25 12:12:26 【问题描述】:

我正在使用 python 并想在 bigquery 中写入表。表的架构如下所示:

test      RECORD    REPEATED    
test.foo  STRING    NULLABLE    
test.bar  STRING    NULLABLE    

我想运行如下命令:

table = dataset.table(name='test_table')
table.insert_data(rows_to_insert)

输入 rows_to_insert 是什么样的。我不断收到错误: 在数组外添加重复值。

【问题讨论】:

【参考方案1】:

假设您的架构定义为:

full_name = SchemaField('full_name', 'STRING', mode='REQUIRED')
area_code = SchemaField('area_code', 'STRING', 'REQUIRED')
local_number = SchemaField('local_number', 'STRING', 'REQUIRED')
rank = SchemaField('rank', 'INTEGER', 'REQUIRED')
phone = SchemaField('phone', 'RECORD', mode='NULLABLE',
                    fields=[area_code, local_number, rank])

那么您要插入的数据如下所示:

rows_to_insert = [
        ('Phred Phlyntstone', 'area_code': '800',
                               'local_number': '555-1212',
                               'rank': 1),
        ('Bharney Rhubble', 'area_code': '877',
                             'local_number': '768-5309',
                             'rank': 2),
        ('Wylma Phlyntstone', None),
    ]

【讨论】:

复制你的例子我得到 invalid_argument: Missing required field: full_name. 抱歉,我在加载架构时遇到了问题,我现在修复了这个问题,我收到错误消息:不支持记录叶类型【参考方案2】:

我今天收到了Repeated value added outside of an array,但不明白为什么,我似乎非常密切地遵循了这些示例。事实证明它适用于一些有限的情况,并且似乎与键的顺序有关......

这有点奇怪,戳了一会儿,我发现必须设置***属性json,所以有效的是:

table.insert_data(["json": row for row in data])

data 基本上是一个或多个字典的列表。

【讨论】:

话虽如此,我现在意识到我错了。一旦我有一个可行的解决方案,我会更新。【参考方案3】:

我遇到了同样的问题并尝试了几个选项,我发现使用 Python API 在 BigQuery 中插入嵌套类型的正确方法,使用与 Dan McClary 相同的示例,如下所示:

full_name = SchemaField('full_name', 'STRING', mode='REQUIRED')
area_code = SchemaField('area_code', 'STRING', 'REQUIRED')
local_number = SchemaField('local_number', 'STRING', 'REQUIRED')
rank = SchemaField('rank', 'INTEGER', 'REQUIRED')
phone = SchemaField('phone', 'RECORD', mode='NULLABLE',
                    fields=[area_code, local_number, rank])

rows_to_insert = [
        ('Phred Phlyntstone', ['area_code': '800',
                               'local_number': '555-1212',
                               'rank': 1]),
        ('Bharney Rhubble', ['area_code': '877',
                             'local_number': '768-5309',
                             'rank': 2])
    ]

请注意,唯一的区别是您必须用[ ]包围嵌套记录

【讨论】:

以上是关于如何在 bigquery 中使用 python 将数据添加到 RECORD 类型的列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 将字典写入 Dataflow 中的 Bigquery

使用 Python 将 Google Cloud Storage 中的数据加载到 BigQuery 时,如何强制忽略双引号?

如何使用 Python 将 bigquery 返回的结果转换为 Json 格式?

如何使用 Apache Beam (Python) 将多个嵌套的 JSON 写入 BigQuery 表

如何使用 python API 在 bigquery 中创建新视图?

如何使用Appengine和来自API的Python脚本流数据将数据流式传输到Google Cloud BigQuery?