使用Python从Google Cloud Storage逐行读取巨大的JSON

时间:2018-10-09 10:24:46

标签: python google-bigquery google-cloud-storage google-python-api

我知道我应该有一个代码,但是我什么都没有。

我的GCS gs://path/listings_all.json上有〜300GB JSON 文件,最终我试图将其导入到BigQuery中,但是它的数据结构有误(我是通过{{1 }}(来自MongoDB)

  

无效的字段名称“ $ date”。字段必须包含   仅字母,数字和下划线,以字母或   下划线,并且最长为128个字符

因此,现在我的方法是以某种方式从GCS逐行读取源文件,并使用python API将每个处理的行上载到BigQuery。

在简单的阅读器下面,我整理了原始原始文件中的100行样本进行测试:

mongoexport

请问我如何使用Python3从Google Cloud Storage逐行读取或流式传输巨大的JSON?

4 个答案:

答案 0 :(得分:3)

逐行读取它,然后尝试流式传输到BigQuery将无法在本地计算机上扩展300GB,并且您将很难获得可用的TBH。

有两个可扩展的选项:

  1. 编写一个Cloud Dataflow管道以从GCS读取文件(它将为您缩放并并行读取),更正字段名称,然后写入BigQuery。参见here
  2. 使用CSV(而不是JSON)作为格式并使用数据中未出现的分隔符将其直接加载到BigQuery中。这会将每个记录加载到单个String列中,然后您可以使用BigQuery的JSON函数提取所需的内容。参见here

答案 1 :(得分:2)

smart_open现在支持流式传输GCS文件。

{{1}}

答案 2 :(得分:1)

使用内置的json解析器逐行解析json文件是行不通的(当然,除非它实际上是"json lines"文档),所以您需要使用streaming parser

但是虽然这将解决内存使用问题,但不会修复无效的json,因此最好的选择是首先将无效的json源修复为纯文本文件,无论是使用python还是使用sed或其他类似工具,然后使用增量解析器来解析您的内容。

def fixfile(sourcepath, destpath):
    with open(sourcepath) as source, open(destpath, "w") as dest:
        for line in source:
            # you may want to use a regexp if this simple solution
            # breaks something else
            line = line.replace("$date", "date")
            dest.write(line)

答案 3 :(得分:1)

这是GCP数据流中与accepted answer中的第一个建议相对应的解决方案的示例实现。您需要在功能 json_processor 中实现json校正。您可以在Datalab笔记本中运行此代码。

setDeveloperKey(developerKey)