狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

GB級比較大的JSON怎么讀取解析呢?

admin
2024年3月28日 23:5 本文熱度 682

比較大的JSON怎么讀取呢?,一兩個G的json,open直接讀取會卡死吧。

這是某群前些天某人的一個提問以及我的回答。

這個話題讓我想到2016年,客戶扔了個10G的json文件過來,BA想提取里面的信息,卻發現Windows下沒有合適的工具打開它,問我咋辦,我當時是用grep處理的。后來知道了jq[1]

jq 是一個輕量級且靈活的命令行JSON處理器,它被設計來處理JSON數據,就像sed用于處理文本數據一樣。你可以使用jq來切片、過濾、映射和轉換結構化數據,其語法簡潔,易于上手。

jq是一個強大的工具,特別適合需要處理和轉換JSON數據的開發者和系統管理員使用。它的設計哲學和功能集使得它成為處理JSON數據的不二之選。

其實這個不二之選,自從有了DuckDB,就不成立了。相比較jq,還是DuckDB更香。

其實我之前就向大家介紹了DuckDB的文章,探索DuckDB:使用SQL和DuckDB分析JSON數據

今天看到一篇文章,和我的想法不謀而合。DuckDB as the New jq[2] 

以下是全文,

最近,我對DuckDB[3]項目(一個面向數據應用的SQLite[4])產生了興趣。它最令人驚嘆的特性之一是包含了許多數據導入器,而且不需要額外的依賴。這意味著它可以直接將JSON作為數據庫表讀取和解析,同時還支持許多其他格式。

我日常工作中大量使用JSON,經常使用 jq[5]來探索文檔。我喜歡jq,但我發現它難以使用。它的語法非常強大,但我每次想要做超出僅僅選擇字段的操作時,都必須研究文檔。

一旦我了解到DuckDB可以直接將JSON文件讀取到內存中,我就意識到我可以用它來做很多我目前使用jq做的事情。與復雜且自定義的jq語法相比,我對SQL非常熟悉,并且幾乎每天都在使用。

這里有一個例子:

首先,我們獲取一些示例JSON來玩。我使用GitHub API獲取了golang組織的倉庫信息:

% curl 'https://api.github.com/orgs/golang/repos' > repos.json

現在,作為一個示例問題來回答,讓我們獲取一些關于使用的開源許可證類型的統計信息。

JSON結構如下所示:

[
  {
    "id": 1914329,
    "name": "gddo",
    "license": {
      "key": "bsd-3-clause",
      "name": "BSD 3-Clause \"New\" or \"Revised\" License",
      ...
    },
    ...
  },
  {
    "id": 11440704,
    "name": "glog",
    "license": {
      "key": "apache-2.0",
      "name": "Apache License 2.0",
      ...
    },
    ...
  },
  ...
]

這可能不是最好的方法,但在我搜索并閱讀了一些關于如何在jq中做到這一點的文檔后,我拼湊出了以下內容:

 % cat repos.json | jq 'group_by(.license.key)
  | map({license: .[0].license.key, count: length})
  | sort_by(.count)
  | reverse'
[
  {
    "license": "bsd-3-clause",
    "count": 23
  },
  {
    "license": "apache-2.0",
    "count": 5
  },
  {
    "license": null,
    "count": 2
  }
]

在DuckDB中使用SQL是這樣的:

% duckdb -c "
  select license->>'key' as license, count(*) as count 
  from 'repos.json' 
  group by 1 
  order by count desc"
┌──────────────┬───────┐
│   license    │ count │
│   varchar    │ int64 │
├──────────────┼───────┤
│ bsd-3-clause │    23 │
│ apache-2.0   │     5 │
│              │     2 │
└──────────────┴───────┘

對我來說,這個SQL要簡單得多,我能夠不查看任何文檔就寫出來。唯一的難點是使用->>操作符查詢嵌套的JSON。這種語法與PostgreSQL JSON Functions[6]相同,所以我對此很熟悉。

如果我們確實需要以JSON格式輸出,DuckDB提供了一個標志來實現這一點:

% duckdb -json -c "
  select license->>'key' as license, count(*) as count 
  from 'repos.json' 
  group by 1 
  order by count desc"
[{"license":"bsd-3-clause","count":23},{"license":"apache-2.0","count":5},{"license":null,"count":2}]

我們甚至可以在DuckDB完成重活之后,使用jq來美化輸出:

% duckdb -json -c "
  select license->>'key' as license, count(*) as count 
  from 'repos.json' 
  group by 1 
  order by count desc" | jq
[
  {
    "license": "bsd-3-clause",
    "count": 23
  },
  {
    "license": "apache-2.0",
    "count": 5
  },
  {
    "license": null,
    "count": 2
  }
]

JSON只是導入DuckDB數據的多種方式之一。這種方法同樣適用于CSV、parquet、Excel文件等。

我可以選擇創建表并本地持久化,但通常我只是在查詢數據,不需要持久化。

想要了解更多關于DuckDB出色的JSON支持,請閱讀這篇博客文章:一次一個向量地撕裂深層嵌套的JSON[7]

更新:

我還了解到,DuckDB可以直接從URL讀取JSON,而不僅僅是本地文件:

% duckdb -c "
  select license->>'key' as license, count(*) as count 
  from read_json('https://api.github.com/orgs/golang/repos')  
  group by 1 
  order by count desc"

引用鏈接

[1] jq: https://jqlang.github.io/jq/
[2] DuckDB as the New jq: https://www.pgrs.net/2024/03/21/duckdb-as-the-new-jq/
[3] DuckDB: https://duckdb.org/
[4] SQLite: https://www.sqlite.org/
[5] jq: https://jqlang.github.io/jq/
[6] PostgreSQL JSON Functions: https://www.postgresql.org/docs/current/functions-json.html
[7] 一次一個向量地撕裂深層嵌套的JSON: https://duckdb.org/2023/03/03/json.html


該文章在 2024/3/28 23:05:22 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved