#parquet #csv #数据 #命令行 #parquet 文件 #json #命令行工具

bin+lib dply

受 dplyr 语法启发的命令行数据操作工具

13 个版本

0.3.2 2024 年 5 月 25 日
0.3.0 2024 年 3 月 4 日
0.2.1 2023 年 10 月 12 日
0.2.0 2023 年 8 月 14 日
0.1.5 2023 年 5 月 29 日

#661解析器实现

Download history 143/week @ 2024-05-23 7/week @ 2024-05-30 5/week @ 2024-06-06 3/week @ 2024-06-13 8/week @ 2024-07-04

每月 896 次下载

Apache-2.0

285KB
3K SLoC

dply 是一个命令行工具,用于查看、查询和写入 csv 和 parquet 文件,受 dplyr 启发。

使用概述

一个 dply 流程包含多个函数,用于读取、转换或写入 Parquet 或 CSV 文件。

CSV、NdJSON 和 Parquet 文件之间的转换

函数 csvjsonparquet 分别用于读取和写入各自格式的数据。以下两个步骤的流程将 Parquet 文件转换为 NdJSON

$ dply -c 'parquet("nyctaxi.parquet") | json("nyctaxi.json")'

如果我们想转换列的子集,可以使用 select 步骤

$ dply -c 'parquet("nyctaxi.parquet") |
    select(ends_with("time"), payment_type) |
    json("nyctaxi.json")'
$ head -2 nyctaxi.json| jq
{
  "payment_type": "Credit card",
  "tpep_dropoff_datetime": "2022-11-22T19:45:53",
  "tpep_pickup_datetime": "2022-11-22T19:27:01"
}
{
  "payment_type": "Cash",
  "tpep_dropoff_datetime": "2022-11-27T16:50:06",
  "tpep_pickup_datetime": "2022-11-27T16:43:26"
}

从嵌套的 NdJSON 中提取嵌套字段

为了从 NdJSON 文件中提取嵌套字段,我们可以在 mutate 步骤中使用 field 函数。以下示例从 payload 对象中的 commits 列表提取 sha

$ dply -c 'json("./tests/data/github.json") |
    mutate(commits = field(payload, commits)) |
    unnest(commits) |
    mutate(sha = field(commits, sha)) |
    select(sha) |
    show()'
shape: (4, 1)
┌──────────────────────────────────────────┐
 sha                                      │
 ---                                      │
 str                                      │
╞══════════════════════════════════════════╡
 a02be18dc2a0faa0faec14f50c8b190ca0b50034 │
 ac97a4ab3a4d86f61a6ba167c06cd8813b470867 │
 null                                     │
 e4b233f1323a4b4e4461ed1aad31d20a7fbf0db4 │
└──────────────────────────────────────────┘

复杂的 NdJSON 文件可以转换为 Parquet 以加快查询处理速度

$ dply -c 'json("github.json") | parquet("github.parquet")'

分组、排序列并将结果保存到文件中

以下流程读取 Parquet 文件[^1],按 payment_type 分组行,计算每种支付类型的最低、平均值和最高票价,将结果保存到 fares.csv CSV 文件中,并显示结果

$ dply -c 'parquet("nyctaxi.parquet") |
    group_by(payment_type) |
    summarize(
        min_price = min(total_amount),
        mean_price = mean(total_amount),
        max_price = max(total_amount)
    ) |
    arrange(payment_type) |
    csv("fares.csv") |
    show()'
shape: (5, 4)
┌──────────────┬───────────┬────────────┬───────────┐
 payment_type ┆ min_price ┆ mean_price ┆ max_price │
 ---          ┆ ---       ┆ ---        ┆ ---       │
 str          ┆ f64       ┆ f64        ┆ f64       │
╞══════════════╪═══════════╪════════════╪═══════════╡
 Cash         ┆ -61.85    ┆ 18.07      ┆ 86.55     │
 Credit card  ┆ 4.56      ┆ 22.969491  ┆ 324.72    │
 Dispute      ┆ -55.6     ┆ -0.145161  ┆ 54.05     │
 No charge    ┆ -16.3     ┆ 0.086667   ┆ 19.8      │
 Unknown      ┆ 9.96      ┆ 28.893333  ┆ 85.02     │
└──────────────┴───────────┴────────────┴───────────┘

在没有参数的情况下运行 dply 将启动交互式客户端

Dply demo

[^1]: 在 tests/data 文件夹中的 nyctaxi.parquet 文件是从 NYC 出租车行程记录数据 中抽取的 250 行 Parquet 文件。

支持的功能

dply 支持以下功能

  • arrange 按列值排序行
  • count 计算列的唯一值
  • config 配置显示格式选项
  • csv 读取或写入 CSV 格式的数据框
  • distinct 保留唯一的行
  • filter 过滤满足给定谓词的行
  • glimpse 显示数据框概览
  • 按组汇总 执行分组聚合
  • head 以表格格式显示数据框的前几行
  • 连接 左连接、内连接、外连接和交叉连接
  • json 以 JSON 格式读取或写入数据框
  • mutate 创建或修改列
  • parquet 以 Parquet 格式读取或写入数据框
  • relocate 移动列的位置
  • rename 重命名列
  • select 选择列
  • show 显示所有数据框行
  • unnest 将列表列展开为行

更多示例可以在 测试文件夹 中找到。

安装

由 GitHub 发布动作生成的 Linux、macOS (x86) 和 Windows 的二进制文件可在 发布页面 获取。

您还可以使用 Cargo 安装 dply

cargo install dply

或从该存储库构建它

git clone https://github.com/vincev/dply-rs
cd dply-rs
cargo install --path .

依赖项

~47–83MB
~1.5M SLoC