31次主要版本更新
41.0.0 | 2024年8月11日 |
---|---|
40.0.0 | 2024年7月12日 |
39.0.0 | 2024年6月10日 |
38.0.0 | 2024年5月10日 |
9.0.0 | 2022年6月13日 |
#55 在 数据库接口
720,267 每月下载量
用于 119 个crate (9 直接)
2.5MB
47K SLoC
DataFusion SQL查询规划器
此crate提供了一款通用的SQL查询规划器,可以解析SQL并将查询转换为逻辑计划。尽管此crate被DataFusion查询引擎使用,但它被设计成易于从任何需要SQL查询规划器的项目中使用,并且不对结果逻辑计划如何转换为物理计划做任何假设。例如,在逻辑计划中没有基于行与基于列执行的概念。
使用示例
请参阅示例目录以获取完全工作的示例。
以下是从SQL字符串生成逻辑计划的示例。
fn main() {
let sql = "SELECT \
c.id, c.first_name, c.last_name, \
COUNT(*) as num_orders, \
SUM(o.price) AS total_price, \
SUM(o.price * s.sales_tax) AS state_tax \
FROM customer c \
JOIN state s ON c.state = s.id \
JOIN orders o ON c.id = o.customer_id \
WHERE o.price > 0 \
AND c.last_name LIKE 'G%' \
GROUP BY 1, 2, 3 \
ORDER BY state_tax DESC";
// parse the SQL
let dialect = GenericDialect {}; // or AnsiDialect, or your own dialect ...
let ast = Parser::parse_sql(&dialect, sql).unwrap();
let statement = &ast[0];
// create a logical query plan
let schema_provider = MySchemaProvider::new();
let sql_to_rel = SqlToRel::new(&schema_provider);
let plan = sql_to_rel.sql_statement_to_plan(statement.clone()).unwrap();
// show the plan
println!("{:?}", plan);
}
这是从示例生成的逻辑计划。请注意,这是一个未优化的逻辑计划。datafusion-optimizer crate提供了一款查询优化器,可以将此crate生成的计划进行优化。
Sort: state_tax DESC NULLS FIRST
Projection: c.id, c.first_name, c.last_name, COUNT(Int64(1)) AS num_orders, SUM(o.price) AS total_price, SUM(o.price * s.sales_tax) AS state_tax
Aggregate: groupBy=[[c.id, c.first_name, c.last_name]], aggr=[[COUNT(Int64(1)), SUM(o.price), SUM(o.price * s.sales_tax)]]
Filter: o.price > Int64(0) AND c.last_name LIKE Utf8("G%")
Inner Join: c.id = o.customer_id
Inner Join: c.state = s.id
SubqueryAlias: c
TableScan: customer
SubqueryAlias: s
TableScan: state
SubqueryAlias: o
TableScan: orders
依赖项
~15–24MB
~342K SLoC