Polars:从 Apache Spark 过渡指南
如果您已经熟悉 Apache Spark,那么在使用 Polars 时需要注意一些关键区别。以下是一些典型的 Spark 操作及其对应的 Polars 实现。
1. 基于列的方法 vs. 基于行的方法
Spark DataFrame 类似于一个行的集合,而 Polars DataFrame 更接近于一个列的集合。这意味着你可以在 Polars 中以 Spark 中不可能的方式组合列。
案例 1: 合并 head 与 sum
在 Polars 中,你可以写出以下语句:
python
df.select([
pl.col("foo").sort().head(2),
pl.col("bar").filter(pl.col("foo") == "d").sum()
])
该代码段输出:
shape: (2, 2)
┌─────┬─────┐
│ foo ┆ bar │
│ --- ┆ --- │
│ str ┆ i64 │
╞═════╪═════╡
│ a ┆ 9 │
├╌╌╌╌╌┼╌╌╌╌╌┤
│ b ┆ 9 │
└─────┴─────┘
列 foo
和 bar
上的表达式是完全独立的。由于 bar
上的表达式返回一个单一的值,这个值在 foo
表达式输出的每个值中都会重复,但是 a
和 b
与产生 9
没有关系。
要在 Spark 中做类似的事情,你需要单独计算总和,并将其作为字面值返回。
案例 2: 合并两个 head
在 Polars 中,你可以在同一个 DataFrame 上结合两个不同的 head
表达式,只要它们返回相同数量的值。
python
df.select([
pl.col("foo").sort().head(2),
pl.col("bar").sort(reverse=True).head(2),
])
该代码段输出:
shape: (3, 2)
┌─────┬─────┐
│ foo ┆ bar │
│ --- ┆ --- │
│ str ┆ i64 │
╞═════╪═════╡
│ a ┆ 5 │
├╌╌╌╌╌┼╌╌╌╌╌┤
│ b ┆ 4 │
└─────┴─────┘
同样,这里的两个 head
表达式是完全独立的,a
与 5
和 b
与 4
的配对纯粹是表达式输出的两列并列的结果。
为了在 Spark 中完成类似的工作,你需要生成一个人工的 key 使你能够以相同的方式连接这些值。
以上代码示例展示了如何将 Spark 中的常见操作转换为 Polars。更多详细信息和高级用法,请访问原网页。