
Polars 如何在 SQLContext 中注册 DataFrame 并执行 SQL 查询取回结果【免费下载链接】polarsExtremely fast Query Engine for DataFrames, written in Rust项目地址: https://gitcode.com/GitHub_Trending/po/polars这篇文章解决一个具体任务把已有的 PolarsDataFrame/LazyFrame以及 Pandas DataFrame、CSV/NDJSON 文件注册进SQLContext然后调用execute执行 SQL 查询并取回结果。适用前提是 Python 环境中已安装 Polarsimport polars as pl需要 Python 依赖包文档中的示例代码位于 docs/source/src/python/user-guide/sql/ 目录。Polars 没有独立的 SQL 引擎SQL 会被翻译成 Polars 表达式再交给它自己的引擎执行所以 SQL 查询能享受和 DataFrame API 相同的查询规划优化。启动 SQLContextSQLContext对象负责管理 SQL 查询内部维护一张「标识符名称 → 数据集」的映射表后续 SQL 语句中写的表名就是这里的标识符。创建一个空上下文import polars as pl ctx pl.SQLContext()注册 DataFrame文档给出了三种在SQLContext初始化时注册的方式来源intro.mddf pl.DataFrame({a: [1, 2, 3]}) lf pl.LazyFrame({b: [4, 5, 6]}) # 方式一register_globalsTrue注册全局命名空间中的所有 DataFrame / LazyFrame 对象 # 上方示例中 df 和 lf 都会以变量名注册 ctx pl.SQLContext(register_globalsTrue) # 方式二通过 frames 参数显式指定「名称 → 帧」映射 ctx pl.SQLContext(frames{table_one: df, table_two: lf}) # 方式三通过 kwargs 注册键即表名 # 这里 df 注册为 df、lf 注册为 lf ctx pl.SQLContext(dfdf, lflf)选择建议需要按自定义表名引用时用frames映射或 kwargs脚本里所有变量都当表用、不想逐个命名时用register_globalsTrue。注册 Pandas DataFrame 需要先用pl.from_pandas转换再注册import pandas as pd df_pandas pd.DataFrame({c: [7, 8, 9]}) ctx pl.SQLContext(df_pandaspl.from_pandas(df_pandas))文档对这个转换有一个成本提示如果 Pandas DataFrame 底层由 NumPy 支撑转换可能比较昂贵如果底层已经是 Arrow转换开销会小得多某些情况下接近免费。SQLContext初始化之后还可以继续增删表register注册单个表register_globals批量注册全局命名空间register_many一次注册多个表unregister注销已有表后续查询和 CTE 示例中都会用到register和register_many。执行查询并取回结果SQL 查询始终以 lazy 模式执行以便利用完整的查询规划优化。文档intro.md给出两种取回结果的方式在SQLContext初始化时设置eagerTrue之后每次execute自动 collect 结果在execute调用时传eagerTrue或者对返回的 LazyFrame 显式调用collect。最小可运行的主路径——把 CSV 懒加载为一个表然后执行查询pokemon pl.scan_csv(docs/assets/data/pokemon.csv) with pl.SQLContext(register_globalsTrue, eagerTrue) as ctx: df_small ctx.execute(SELECT * from pokemon LIMIT 5) print(df_small)eagerTrue下execute直接返回DataFrame若未设置 eager返回的是LazyFrame需要自己collect才能得到可打印、可消费的结果。用 SHOW TABLES 核对注册是否成功注册完成后执行SHOW TABLES可以列出当前上下文中所有已注册的表及其名称用来确认表名拼写无误再写查询。SHOW TABLES只列出当前SQLContext中注册的表——注册到别的上下文或别的 Python 会话里的表不会出现在列表里。df1 pl.LazyFrame( { name: [Alice, Bob, Charlie, David], age: [25, 30, 35, 40], } ) df2 pl.LazyFrame( { name: [Ellen, Frank, Gina, Henry], age: [45, 50, 55, 60], } ) ctx pl.SQLContext(mytable1df1, mytable2df2) tables ctx.execute(SHOW TABLES, eagerTrue) print(tables)返回的是一个包含已注册表名列表的 DataFrame检查其中是否包含mytable1、mytable2即可确认注册成功示例来源show.md。执行一条完整的 CTE 查询注册和取回结果之外Polars 支持WITH子句定义的 CTEcte.md。下面是文档中的完整示例演示了registerexecute(eagerTrue) 打印结果的完整闭环ctx pl.SQLContext() df pl.LazyFrame( {name: [Alice, Bob, Charlie, David], age: [25, 30, 35, 40]} ) ctx.register(my_table, df) result ctx.execute( WITH older_people AS ( SELECT * FROM my_table WHERE age 30 ) SELECT * FROM older_people WHERE STARTS_WITH(name,C) , eagerTrue, ) print(result)这条查询先在 CTEolder_people中筛出age 30的行再从中选出name以C开头的行。可选分支混合多个数据源执行同一查询execute也可以直接作用于多类来源文档示例同时注册了一个 CSV 文件scan_csv懒加载、一个 NDJSON 文件scan_ndjson懒加载和一个 Pandas DataFrame然后用 SQL 把它们 join 起来。懒读取让 Polars 只加载必要的行和列。同样的方式也可以注册云数据湖S3、Azure Data Lake让 PyArrow dataset 指向数据湖再用scan_pyarrow_dataset读入。# 文档示例的输入 # products_masterdata.csv schema: {product_id: Int64, product_name: String} # products_categories.json schema: {product_id: Int64, category: String} # sales_data 是 Pandas DataFrameschema: {product_id: Int64, sales: Int64} with pl.SQLContext( products_masterdatapl.scan_csv(docs/assets/data/products_masterdata.csv), products_categoriespl.scan_ndjson(docs/assets/data/products_categories.json), sales_datapl.from_pandas(sales_data), eagerTrue, ) as ctx: query SELECT product_id, product_name, category, sales FROM products_masterdata LEFT JOIN products_categories USING (product_id) LEFT JOIN sales_data USING (product_id) print(ctx.execute(query))注意products_masterdata.csv和products_categories.json需要先准备在对应路径下文档示例在 intro.py 的prepare_multiple_sources片段中先生成了这两个文件执行完后用os.remove清理这里保留说明而不把清理步骤并入主路径。支持的 SQL 范围与限制写查询前需要知道 Polars 支持的是 SQL 的一个常见子集而不是完整 SQL 规范方言上尽可能遵循 PostgreSQL 的语法定义和函数行为。文档列出的支持项包括CREATE TABLE xxx AS ...含WHERE、ORDER BY、LIMIT、GROUP BY、UNION、JOIN子句的SELECTCTEWITH tablename AS ...EXPLAIN SELECT ...SHOW TABLESDROP TABLE [IF EXISTS] tablenameTRUNCATE TABLE [IF EXISTS] tablename明确尚未支持的INSERT、UPDATE、DELETE语句以及ANALYZE之类的元查询。如果你的现有 SQL 代码库依赖这些语句需要先确认能否改写成CREATE TABLE AS等支持的形式。另外文档在开头给出了一条方向性说明Polars 的 DataFrame 接口是主接口新特性通常先加到表达式 API如果有 SQL 使用习惯SQLContext是官方支持的入口。SQL 能覆盖的场景还可以查看 select.md 中GROUP BY、ORDER BY、JOIN、SQL 函数和表函数read_csv等直接在 SQL 里读文件的具体示例以及 create.md 中CREATE TABLE的用法。【免费下载链接】polarsExtremely fast Query Engine for DataFrames, written in Rust项目地址: https://gitcode.com/GitHub_Trending/po/polars创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考