Python API#
介绍#
Polars SQL 接口有四个主要入口点,每个入口点在不同的粒度级别上操作。首先是 SQLContext 对象,
一个顶层的 polars.sql() 函数,它在全局上下文中操作,
框架级别的 DataFrame.sql() 和 LazyFrame.sql() 方法,以及
polars.sql_expr() 函数,它从 SQL 创建原生表达式。
查询#
SQL查询可以针对当前全局变量中的兼容数据结构、特定框架发出,或合并到表达式中。
全局SQL#
无论是 SQLContext 还是 polars.sql() 函数,都可以用于通过 Polars 执行引擎对 Polars 的 DataFrame、LazyFrame 和 Series 数据执行 SQL 查询,同时也可以对 Pandas 的 DataFrame 和 Series,以及 PyArrow 的 Table 和 RecordBatch 对象执行查询。非 Polars 对象在 SQL 查询中使用时会被隐式转换为 DataFrame;对于使用 PyArrow 数据类型的 PyArrow 和 Pandas 数据,如果底层数据能够清晰地映射到原生支持的数据类型,这种转换通常可以是零拷贝的。
示例:
import polars as pl
import pandas as pd
polars_df = pl.DataFrame({"a": [1, 2, 3, 4], "b": [4, 5, 6, 7]})
pandas_df = pd.DataFrame({"a": [3, 4, 5, 6], "b": [6, 7, 8, 9]})
polars_series = (polars_df["a"] * 2).rename("c")
pyarrow_table = polars_df.to_arrow()
pl.sql(
"""
SELECT a, b, SUM(c) AS c_total FROM (
SELECT * FROM polars_df -- polars frame
UNION ALL SELECT * FROM pandas_df -- pandas frame
UNION ALL SELECT * FROM pyarrow_table -- pyarrow table
) all_data
INNER JOIN polars_series
ON polars_series.c = all_data.b -- polars series
GROUP BY "a", "b"
ORDER BY "a", "b"
"""
).collect()
# shape: (3, 3)
# ┌─────┬─────┬─────────┐
# │ a ┆ b ┆ c_total │
# │ --- ┆ --- ┆ --- │
# │ i64 ┆ i64 ┆ i64 │
# ╞═════╪═════╪═════════╡
# │ 1 ┆ 4 ┆ 8 │
# │ 3 ┆ 6 ┆ 18 │
# │ 5 ┆ 8 ┆ 8 │
# └─────┴─────┴─────────┘
另请参阅
框架SQL#
直接针对特定的底层eager/lazy框架执行SQL,将其引用为“self”;返回一个表示查询结果的新框架。
示例:
import polars as pl
df = pl.DataFrame({
"a": [1, 2, 3],
"b": [4, 5, 6],
})
df.sql("""
SELECT a::uint4, (b * b) AS bb
FROM self WHERE a != 2
""")
# shape: (2, 2)
# ┌─────┬─────┐
# │ a ┆ bb │
# │ --- ┆ --- │
# │ u32 ┆ i64 │
# ╞═════╪═════╡
# │ 1 ┆ 16 │
# │ 3 ┆ 36 │
# └─────┴─────┘
表达式 SQL#
polars.sql_expr() 函数可用于从SQL片段创建本地的Polars表达式。
示例:
import polars as pl
df = pl.DataFrame({
"a": [1, 2, 3],
"b": [4, 5, 6],
})
df.with_columns(
pl.sql_expr("(a * a) + (b::float / 2) AS expr1"),
pl.sql_expr("CONCAT_WS(':',a,b) AS expr2")
)
# shape: (3, 4)
# ┌─────┬─────┬───────┬───────┐
# │ a ┆ b ┆ expr1 ┆ expr2 │
# │ --- ┆ --- ┆ --- ┆ --- │
# │ i64 ┆ i64 ┆ f64 ┆ str │
# ╞═════╪═════╪═══════╪═══════╡
# │ 1 ┆ 4 ┆ 3.0 ┆ 1:4 │
# │ 2 ┆ 5 ┆ 6.5 ┆ 2:5 │
# │ 3 ┆ 6 ┆ 12.0 ┆ 3:6 │
# └─────┴─────┴───────┴───────┘
SQLContext#
Polars 提供了一个专用的类用于查询框架数据,该类提供了对表注册和状态管理的额外控制,并且也可以用作上下文管理器。这就是 SQLContext 对象,它提供了其他 SQL 函数所使用的所有核心功能。
- class polars.SQLContext[source]#
对DataFrame/LazyFrame数据运行SQL查询。
- __init__(
- frames: Mapping[str, CompatibleFrameType | None] | None = None,
- *,
- register_globals: bool | int = False,
- eager: bool = False,
- **named_frames: CompatibleFrameType | None,
初始化一个新的
SQLContext。- Parameters:
- frames
一个
{name:frame, ...}映射,可以包括Polars框架和pandas的DataFrames、Series以及pyarrow的Table和RecordBatch对象。- register_globals
注册在全局变量中找到的兼容对象(polars DataFrame、LazyFrame 和 Series),自动将它们的变量名映射到表名。要注册其他对象(pandas/pyarrow 数据),请显式传递它们,或调用
execute_global类方法。如果给定一个整数,则只注册找到的最新的“n”个对象。- eager
如果为True,返回执行结果为
DataFrame而不是LazyFrame。 (请注意,查询本身始终以惰性模式执行;此参数影响execute()返回的是急切还是惰性的结果框架)。- **named_frames
命名的急切/惰性框架,作为kwargs提供。
示例
>>> lf = pl.LazyFrame({"a": [1, 2, 3], "b": ["x", None, "z"]}) >>> res = pl.SQLContext(frame=lf).execute( ... "SELECT b, a*2 AS two_a FROM frame WHERE b IS NOT NULL" ... ) >>> res.collect() shape: (2, 2) ┌─────┬───────┐ │ b ┆ two_a │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════╪═══════╡ │ x ┆ 2 │ │ z ┆ 6 │ └─────┴───────┘
注意: 也可以用作上下文管理器。
- __exit__(
- exc_type: type[BaseException] | None,
- exc_val: BaseException | None,
- exc_tb: TracebackType | None,
在上下文退出时注销在给定范围内创建的任何表。
另请参阅
方法#
|
解析给定的SQL查询并在注册的框架数据上执行它。 |
|
立即执行SQL查询,自动注册框架全局变量。 |
|
使用给定的名称将单个帧注册为表。 |
|
注册在当前全局作用域中找到的所有框架(惰性或急切)。 |
|
使用关联的名称将多个急切/懒加载的帧注册为表格。 |
返回已注册表名的列表。 |
|
|
通过名称注销一个或多个急切/懒加载框架。 |
示例:
import polars as pl
df1 = pl.DataFrame({"id": [1, 2, 3], "value": [0.1, 0.2, 0.3]})
df2 = pl.DataFrame({"id": [3, 2, 1], "value": [25.6, 53.4, 12.7]})
with pl.SQLContext(df_a=df1, df_b=df2, eager=True) as ctx:
df = ctx.execute("""
SELECT
a.id,
a.value AS value_a,
b.value AS value_b
FROM df_a AS a INNER JOIN df_b AS b USING (id)
ORDER BY id
""")
# shape: (3, 3)
# ┌─────┬─────────┬─────────┐
# │ id ┆ value_a ┆ value_b │
# │ --- ┆ --- ┆ --- │
# │ i64 ┆ f64 ┆ f64 │
# ╞═════╪═════════╪═════════╡
# │ 1 ┆ 0.1 ┆ 25.6 │
# │ 2 ┆ 0.2 ┆ 53.4 │
# │ 3 ┆ 0.3 ┆ 12.7 │
# └─────┴─────────┴─────────┘
另请参阅