读取JSON文件#

Arrow 支持从以换行符分隔的 JSON 文件中读取列式数据。在这种情况下,JSON 文件由多个 JSON 对象组成,每行一个,表示单独的数据行。例如,以下文件表示具有四个列“a”、“b”、“c”、“d”的两行数据

{"a": 1, "b": 2.0, "c": "foo", "d": false}
{"a": 4, "b": -5.5, "c": null, "d": true}

目前提供的功能如下:

  • 多线程或单线程读取

  • 自动解压缩输入文件(基于文件名扩展名,例如 my_data.json.gz

  • 复杂的类型推断(见下文)

注意

目前仅支持以换行符分隔的 JSON 格式。

用法#

JSON 读取功能可通过 pyarrow.json 模块获得。在许多情况下,您只需调用 read_json() 函数,并提供要从中读取的文件路径

>>> from pyarrow import json
>>> fn = 'my_data.json'
>>> table = json.read_json(fn)
>>> table
pyarrow.Table
a: int64
b: double
c: string
d: bool
>>> table.to_pandas()
   a    b     c      d
0  1  2.0   foo  False
1  4 -5.5  None   True

自动类型推断#

Arrow 数据类型 是从每列的 JSON 类型和值推断出来的

  • JSON 空值转换为 null 类型,但可以回退到任何其他类型。

  • JSON 布尔值转换为 bool_

  • JSON 数字转换为 int64,如果遇到非整数,则回退到 float64

  • “YYYY-MM-DD”和“YYYY-MM-DD hh:mm:ss”类型的 JSON 字符串转换为 timestamp[s],如果发生转换错误,则回退到 utf8

  • JSON 数组转换为 list 类型,并且递归地对 JSON 数组的值进行推断。

  • 嵌套 JSON 对象转换为 struct 类型,并且递归地对 JSON 对象的值进行推断。

因此,读取此 JSON 文件

{"a": [1, 2], "b": {"c": true, "d": "1991-02-03"}}
{"a": [3, 4, 5], "b": {"c": false, "d": "2019-04-01"}}

会返回以下数据

>>> table = json.read_json("my_data.json")
>>> table
pyarrow.Table
a: list<item: int64>
  child 0, item: int64
b: struct<c: bool, d: timestamp[s]>
  child 0, c: bool
  child 1, d: timestamp[s]
>>> table.to_pandas()
           a                                       b
0     [1, 2]   {'c': True, 'd': 1991-02-03 00:00:00}
1  [3, 4, 5]  {'c': False, 'd': 2019-04-01 00:00:00}

自定义解析#

如果读取具有不寻常结构的 JSON 文件,要更改默认解析设置,您应该创建一个 ParseOptions 实例,并将其传递给 read_json()。例如,您可以传递一个显式的 schema 以绕过自动类型推断。

同样,您可以通过将 ReadOptions 实例传递给 read_json() 来选择性能设置。

增量读取#

对于内存受限的环境,也可以使用 open_json() 每次读取一个批次的 JSON 文件。

在这种情况下,类型推断在第一个块上完成,并且之后类型被冻结。要确保推断出正确的数据类型,请将 ReadOptions.block_size 设置为一个足够大的值,或者使用 ParseOptions.explicit_schema 显式设置所需的数据类型。