使用空字典作为值将 JSON 文件加载到 BigQuery

Posted

技术标签:

【中文标题】使用空字典作为值将 JSON 文件加载到 BigQuery【英文标题】:Load JSON file to BigQuery with empty dict as a value 【发布时间】:2021-01-26 15:23:56 【问题描述】:

我正在将一个以换行符分隔的 JSON 文件从 GCS 上传到 BigQuery。 JSON 文件中有一些字段包含值的字典,我可以毫无问题地将这些值导入 BigQuery,因为嵌套字段被分解为单独的列。因此,如果以下示例是 JSON 文件中的一行,则一切正常:

"dict_field": "value1": 1, "value2": 2

但是,如果文件中的一行有一个空字典作为 field_dict 的值,如下所示:

"dict_field":

我收到以下错误消息:

异常:BigQuery 作业失败。最终错误是:'reason': 'invalid', 'message': "Unsupported empty struct type for field 'dict_field'" [...]

我查看了 BigQuery 文档,找不到任何关于将空字典作为值的规定限制。有谁知道这个问题是否有解决方法,或者我是否必须在将数据导入 BigQuery 之前手动清理数据?

【问题讨论】:

我认为您的问题可能与此功能请求有关https://issuetracker.google.com/130890049 您能否分享您在提交字典时发送到 BigQuery 的代码和选项? BigQuery 目前不支持加载具有空结构的 JSON 数据。除了从 JSON 数据中删除空结构之外,没有其他解决方法。如果您使用任何编程语言,您可以遍历您的 JSON 数据并将空结构“”替换为“null”值。除此之外,剩下的唯一选择是在上面共享的Feature Request 中跟进,以获取有关在 BigQuery 中加载 JSON 数据时实现对空结构的支持的任何可能更新。 【参考方案1】:

正如@rodvictor 和@Fcojavmelo 所指出的,虽然BigQuery 文档中没有明确提及,但目前无法从JSON 文件中加载空字典,仅在此issue/feature request 中。

总之,必须手动清理数据,并删除所有空字典以避免错误。

【讨论】:

【参考方案2】:

奇怪的是,这没有记录在案,多亏了这个答案,我才确信我没有服用疯狂的药丸。

在我的情况下,我正在尝试将 Shopify 数据从 Python 加载到 BigQuery。这个递归函数通过将空字典替换为None 来帮助清理空字典:

def replace_blank_dict(d):
    if not d:
        return None
    if type(d) is list:
        for list_item in d:
            if type(list_item) is dict:
                for k, v in list_item.items():
                    list_item[k] = replace_blank_dict(v)
    if type(d) is dict:
        for k, v in d.items():
            d[k] = replace_blank_dict(v)
    return d

在循环Orders from the Shopify REST API 列表时这样调用:

    for order in orders:
        for k, v in order.items():
            order[k] = replace_blank_dict(v)

【讨论】:

以上是关于使用空字典作为值将 JSON 文件加载到 BigQuery的主要内容,如果未能解决你的问题,请参考以下文章

追加到 json 中转储的字典列表,而不用 python 加载列表

Json 文件到字典

如何使用空值将字符串转换为日期时间 - python,pandas?

使用键值将字典发送到 iCloud

使用双引号(“)作为值将 JavaScript 对象转换为 Json

如何解压缩数据框列中存在的 json 的键,值将转换为键作为列,而使用 python 将其值转换为列?