
开源 Java 数据处理库 CupOfTea 发布
来源标题:New open source Java Data Library
CupOfTea 是一个轻量级 Java 数据处理库,提供简洁高效的 API 处理大型结构化数据集。它支持从数组、列表和 CSV 等来源创建 DataFrame,并涵盖过滤、聚合、连接等操作,还支持缺失值模型和精确货币运算。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
CupOfTea 是一个用于 Java 数据处理的轻量级库。它提供了简单高效的 API 来处理大型结构化数据集,支持过滤、聚合、连接和数据分析等操作。 支持从数组、列表、CSV 文件以及其他来源创建 DataFrame。 一等公民的 Schema 定义:Schema.of("year", INT, "price", DOUBLE)。 在 CSV、JSON 和 Excel 导入时可选自动类型推断。 一等公民的缺失值模型(NA),与空字符串("")区分开来。 完整支持 java.time(LocalDate、LocalDateTime、Instant)。 使用 BigDecimal 进行精确货币运算(Schema.DECIMAL)。 支持列选择、行过滤、分组、聚合和切片操作。 关系连接:innerJoin、leftJoin、rightJoin、outerJoin、crossJoin,支持自动列去重、多键连接和自定义后缀。 统计运算与摘要:高性能线性 $O(n)$ 分位数和中位数(通过 Introselect 实现)、样本与总体方差和标准差、偏度、峰度、协方差、相关矩阵(corr())以及描述性摘要(describe())。 窗口、滚动与累积函数:滑动滚动窗口(df.rolling(w))、扩展窗口(df.expanding())、累积操作(cumsum、cumprod、cummin、cummax)、时间序列平移(lead、lag、diff、pctChange),以及类似 SQL 的分析窗口分区与排名(df.window().partitionBy(...).orderBy(...).rank())。 读写 CSV、JSON、Excel、Parquet 和 YAML 文件。 DTO 与 Record 映射:直接导入和导出标准 Java POJO/JavaBean 和 Java Record(CupOfTea.read().records(...)、df.write().records(...)、CupOfTea.read().dtos(...)、df.write().dtos(...))。 列式引擎:高性能连续内存布局(ColumnVector 使用基本类型 int[]、double[]、long[]、float[]、boolean[]、String[] 以及 BitSet 空值位掩码),消除逐单元装箱对象开销和行哈希查找。 统一的变更模式:默认使用流式 IN_PLACE 构建器,可通过 .asCopyOnWrite() 和 .asInPlace() 选择启用 COPY_ON_WRITE。 深拷贝:CupOfTea 和 IDataFrame 上提供显式的 .copy() 深拷贝方法。 不可变 Row API:强类型、不可修改的 Row 对象,提供类型化访问器(getInt、getString、getDouble、getBoolean、getLocalDate 等),内部可变行映射零泄漏。 环境要求 Java:Java 17 LTS 或更高版本 构建工具:Maven 3.8+ 或 Gradle 7+ 安装 CupOfTea 是模块化的。你可以只导入核心引擎以及项目所需的 IO 格式模块,或者引入 cupoftea-all 以获得完整的格式支持。 <dependency> <groupId>io.github.cupoftea-labs</groupId> <artifactId>cupoftea-core</artifactId> <version>0.24.0</version> </dependency> 按需添加可选的格式模块(CSV、JSON、Excel、Parquet、Arrow、Plot、SQL、HTML、YAML、XML):
<!-- Example: Add CSV and JSON format support --> <dependency> <groupId>io.github.cupoftea-labs</groupId> <artifactId>cupoftea-csv</artifactId> <version>0.24.0</version> </dependency> <dependency> <groupId>io.github.cupoftea-labs</groupId> <artifactId>cupoftea-json</artifactId> <version>0.24.0</version> </dependency> <!-- Or import all formats with the aggregator module: --> <!-- <dependency> <groupId>io.github.cupoftea-labs</groupId> <artifactId>cupoftea-all</artifactId> <version>0.24.0</version> </dependency> --> 有关版本发布和发布的更多详细信息,请参阅 docs/community/releasing.md。 // Core library implementation 'io.github.cupoftea-labs:cupoftea-core:0.24.0' // Optional format modules implementation 'io.github.cupoftea-labs:cupoftea-csv:0.24.0' implementation 'io.github.cupoftea-labs:cupoftea-json:0.24.0' // Or all formats at once: // implementation 'io.github.cupoftea-labs:cupoftea-all:0.24.0' Kotlin DSL(build.gradle.kts): // Core library implementation("io.github.cupoftea-labs:cupoftea-core:0.24.0") // Optional format modules implementation("io.github.cupoftea-labs:cupoftea-csv:0.24.0") implementation("io.github.cupoftea-labs:cupoftea-json:0.24.0") // Or all formats at once: // implementation("io.github.cupoftea-labs:cupoftea-all:0.24.0") 可用模块 模块 描述 依赖 / 格式 cupoftea-core 核心 DataFrame 引擎、过滤、聚合、SPI 接口 无重量级外部依赖 cupoftea-csv CSV 格式读写器 OpenCSV cupoftea-json JSON 格式读写器 Jackson Databind cupoftea-excel Excel 格式读取器(.xlsx / .xls) Apache POI 5.5.1 cupoftea-parquet Parquet 格式读写器 Apache Parquet / Hadoop cupoftea-arrow Apache Arrow IPC 和 Feather 零拷贝格式读写器 Apache Arrow Vector & Netty cupoftea-sql 通过 JDBC 实现 SQL 数据库读写,支持批处理和事务 JDBC(java.sql、javax.sql) cupoftea-html HTML 表格读取器 Jsoup cupoftea-yaml YAML 格式读写器 SnakeYAML cupoftea-xml XML 格式读取器 标准 Java XML DOM cupoftea-plot 声明式绘图引擎(Vega-Lite)、HTML 导出、桌面预览 Jackson Databind cupoftea-all 聚合所有格式和绘图模块的元模块 上述所有格式及绘图 使用示例 读写数据(流式 API) IO 格式通过 ServiceLoader 动态发现。确保对应的格式模块位于你的 classpath 中: import com.cupoftea.CupOfTea; import com.cupoftea.table.Row; import com.cupoftea.table.Schema; import static com.cupoftea.table.Schema.*; import java.io.File; public class Main { public static void main(String[] args) { // Read CSV using fluent API CupOfTea df = CupOfTea.read().csv("data.csv"); df.print(); // Perform filtering with immutable Row CupOfTea filtered = df.filter(row -> row.getInt("age") != null && row.getInt("age") > 30); filtered.print(); // Core pandas-like ops: // Selection and dropping of columns (use copy() for independent views) CupOfTea selected = df.copy().select("name", "age", "salary"); CupOfTea withoutDept = df.copy().drop("department"); // Inspection: head, tail, and slicing df.head(5).print();(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。