【问题标题】:How to add data to a RECORD type column using python in bigquery如何在 bigquery 中使用 python 将数据添加到 RECORD 类型的列
【发布时间】: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 是什么样的。我不断收到错误: 在数组外添加重复值。

【问题讨论】:

    标签: python google-bigquery


    【解决方案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}])
        ]
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 2011-02-03
      • 2021-11-17
      • 2021-12-28
      • 1970-01-01
      • 2011-09-24
      • 2021-12-19
      相关资源
      最近更新 更多