读取 JSON 文件#
Arrow 支持从行分隔(line-delimited)的 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 格式。
用法#
可以通过 pyarrow.json 模块使用 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 值转换为
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() 每次读取一个批次(batch)的 JSON 文件。
在这种情况下,类型推断是在第一个数据块上进行的,之后类型即被固定。为确保推断出正确的数据类型,请将 ReadOptions.block_size 设置为一个足够大的值,或者使用 ParseOptions.explicit_schema 显式设置所需的数据类型。