讀取 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 值會轉換為 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()。例如,您可以傳遞明確的 綱要,以便繞過自動類型推斷。

同樣地,您可以透過將 ReadOptions 實例傳遞給 read_json(),來選擇效能設定。